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

Configure Feed

Select the types of activity you want to include in your feed.

Merge tag 'ux500-dts-v5.19' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-nomadik into arm/dt

Ux500 DTS updates for the v5.19 kernel cycle:

- New devicetree for Codina TMO (SGH-T599).

- Add the Amastaos proximity sensor to the Codina.

- Add line impedance per machine to the Fuel Gauge
nodes.

- Add GPS to Janice, Skomer and Codina.

- Add NFC to the Codina for GT-I8160P.

- Some janitorial like clock names.

* tag 'ux500-dts-v5.19' of git://git.kernel.org/pub/scm/linux/kernel/git/linusw/linux-nomadik:
ARM: dts: ux500: Add GPS to the Codina
ARM: dts: ux500: Add NFC to the Codina
ARM: dts: ux500: Add GPS to Skomer device tree
ARM: dts: ux500: Add GPS to Janice device tree
ARM: dts: ux500: Add line impedance to fuel gauge
ARM: dts: ux500: Register Amstaos proximity sensor
ARM: dts: ux500: Add Codina TMO device tree
dt-bindings: arm: ux500: Document Codina-TMO
ARM: dts: ste-dbx: Update spi clock-names property

Link: https://lore.kernel.org/r/CACRpkdYngWscqak5phKm58O2GF0RmVETgwW4NCKTBiASdaEcyg@mail.gmail.com
Signed-off-by: Arnd Bergmann <arnd@arndb.de>

+956 -18
+5
Documentation/devicetree/bindings/arm/ux500.yaml
··· 40 40 - const: samsung,codina 41 41 - const: st-ericsson,u8500 42 42 43 + - description: Samsung Galaxy Exhibit (SGH-T599) 44 + items: 45 + - const: samsung,codina-tmo 46 + - const: st-ericsson,u8500 47 + 43 48 - description: Samsung Galaxy Beam (GT-I8530) 44 49 items: 45 50 - const: samsung,gavini
+1
arch/arm/boot/dts/Makefile
··· 1382 1382 ste-ux500-samsung-janice.dtb \ 1383 1383 ste-ux500-samsung-gavini.dtb \ 1384 1384 ste-ux500-samsung-codina.dtb \ 1385 + ste-ux500-samsung-codina-tmo.dtb \ 1385 1386 ste-ux500-samsung-skomer.dtb \ 1386 1387 ste-ux500-samsung-kyle.dtb 1387 1388 dtb-$(CONFIG_ARCH_UNIPHIER) += \
+6 -6
arch/arm/boot/dts/ste-dbx5x0.dtsi
··· 755 755 #address-cells = <1>; 756 756 #size-cells = <0>; 757 757 clocks = <&prcc_kclk 3 1>, <&prcc_pclk 3 1>; 758 - clock-names = "SSPCLK", "apb_pclk"; 758 + clock-names = "sspclk", "apb_pclk"; 759 759 dmas = <&dma 8 0 0x2>, /* Logical - DevToMem */ 760 760 <&dma 8 0 0x0>; /* Logical - MemToDev */ 761 761 dma-names = "rx", "tx"; ··· 772 772 #address-cells = <1>; 773 773 #size-cells = <0>; 774 774 clocks = <&prcc_kclk 3 2>, <&prcc_pclk 3 2>; 775 - clock-names = "SSPCLK", "apb_pclk"; 775 + clock-names = "sspclk", "apb_pclk"; 776 776 dmas = <&dma 9 0 0x2>, /* Logical - DevToMem */ 777 777 <&dma 9 0 0x0>; /* Logical - MemToDev */ 778 778 dma-names = "rx", "tx"; ··· 790 790 #size-cells = <0>; 791 791 /* Same clock wired to kernel and pclk */ 792 792 clocks = <&prcc_pclk 2 8>, <&prcc_pclk 2 8>; 793 - clock-names = "SSPCLK", "apb_pclk"; 793 + clock-names = "sspclk", "apb_pclk"; 794 794 dmas = <&dma 0 0 0x2>, /* Logical - DevToMem */ 795 795 <&dma 0 0 0x0>; /* Logical - MemToDev */ 796 796 dma-names = "rx", "tx"; ··· 807 807 #size-cells = <0>; 808 808 /* Same clock wired to kernel and pclk */ 809 809 clocks = <&prcc_pclk 2 2>, <&prcc_pclk 2 2>; 810 - clock-names = "SSPCLK", "apb_pclk"; 810 + clock-names = "sspclk", "apb_pclk"; 811 811 dmas = <&dma 35 0 0x2>, /* Logical - DevToMem */ 812 812 <&dma 35 0 0x0>; /* Logical - MemToDev */ 813 813 dma-names = "rx", "tx"; ··· 824 824 #size-cells = <0>; 825 825 /* Same clock wired to kernel and pclk */ 826 826 clocks = <&prcc_pclk 2 1>, <&prcc_pclk 2 1>; 827 - clock-names = "SSPCLK", "apb_pclk"; 827 + clock-names = "sspclk", "apb_pclk"; 828 828 dmas = <&dma 33 0 0x2>, /* Logical - DevToMem */ 829 829 <&dma 33 0 0x0>; /* Logical - MemToDev */ 830 830 dma-names = "rx", "tx"; ··· 841 841 #size-cells = <0>; 842 842 /* Same clock wired to kernel and pclk */ 843 843 clocks = <&prcc_pclk 1 7>, <&prcc_pclk 1 7>; 844 - clock-names = "SSPCLK", "apb_pclk"; 844 + clock-names = "sspclk", "apb_pclk"; 845 845 dmas = <&dma 40 0 0x2>, /* Logical - DevToMem */ 846 846 <&dma 40 0 0x0>; /* Logical - MemToDev */ 847 847 dma-names = "rx", "tx";
+785
arch/arm/boot/dts/ste-ux500-samsung-codina-tmo.dts
··· 1 + // SPDX-License-Identifier: GPL-2.0-only 2 + /* 3 + * Devicetree for the Samsung Galaxy Exhibit SGH-T599 also known as Codina-TMO, 4 + * the "TMO" shall be read "T-Mobile" as this phone was produced exlusively 5 + * for T-Mobile in the United States. 6 + * 7 + * This phone is closely related to the Codina, but has: 8 + * - No CPU speed cap, full ~1GHz rate 9 + * - Different power management IC, AB8505 10 + * - As AB8505 has a micro USB phy, no TI TSU6111 11 + * - Different power routing such as the removal of the external LDO for the 12 + * touchscreen in favor of using the AB8505 13 + * - Using a regulator for the key backlight LED 14 + * - Using the Samsung S6D27A1 panel by default 15 + * - The panel is using one of the ordinary AB8505 regulators for 1.8V 16 + * - WiFi/Bluetooth combi chip upgraded to BCM4334 17 + * - GPIO for backlight control moved from 68 to 69 18 + */ 19 + 20 + /dts-v1/; 21 + #include "ste-db8500.dtsi" 22 + #include "ste-ab8505.dtsi" 23 + #include "ste-dbx5x0-pinctrl.dtsi" 24 + #include <dt-bindings/gpio/gpio.h> 25 + #include <dt-bindings/leds/common.h> 26 + #include <dt-bindings/input/input.h> 27 + #include <dt-bindings/interrupt-controller/irq.h> 28 + 29 + / { 30 + model = "Samsung Galaxy Exhibit (SGH-T599)"; 31 + compatible = "samsung,codina-tmo", "st-ericsson,u8500"; 32 + 33 + chosen { 34 + stdout-path = &serial2; 35 + }; 36 + 37 + battery: battery { 38 + compatible = "samsung,eb425161lu"; 39 + }; 40 + 41 + thermal-zones { 42 + battery-thermal { 43 + /* This zone will be polled by the battery temperature code */ 44 + polling-delay = <0>; 45 + polling-delay-passive = <0>; 46 + thermal-sensors = <&bat_therm>; 47 + }; 48 + }; 49 + 50 + bat_therm: thermistor { 51 + compatible = "samsung,1404-001221"; 52 + io-channels = <&gpadc 0x02>; /* BatTemp */ 53 + pullup-uv = <1800000>; 54 + pullup-ohm = <230000>; 55 + pulldown-ohm = <0>; 56 + #thermal-sensor-cells = <0>; 57 + }; 58 + 59 + /* TI TXS0206 level translator for 2.9 V */ 60 + sd_level_translator: regulator-gpio { 61 + compatible = "regulator-fixed"; 62 + 63 + /* GPIO87 EN */ 64 + gpios = <&gpio2 23 GPIO_ACTIVE_HIGH>; 65 + enable-active-high; 66 + 67 + regulator-name = "sd-level-translator"; 68 + regulator-min-microvolt = <2900000>; 69 + regulator-max-microvolt = <2900000>; 70 + regulator-type = "voltage"; 71 + 72 + startup-delay-us = <200>; 73 + 74 + pinctrl-names = "default"; 75 + pinctrl-0 = <&sd_level_translator_default>; 76 + }; 77 + 78 + /* External LDO MIC5366-3.3YMT for eMMC */ 79 + ldo_3v3_reg: regulator-gpio-ldo-3v3 { 80 + compatible = "regulator-fixed"; 81 + /* Supplied in turn by VBAT */ 82 + regulator-name = "VMEM_3V3"; 83 + regulator-min-microvolt = <3300000>; 84 + regulator-max-microvolt = <3300000>; 85 + gpios = <&gpio6 31 GPIO_ACTIVE_HIGH>; 86 + startup-delay-us = <5000>; 87 + enable-active-high; 88 + pinctrl-names = "default"; 89 + pinctrl-0 = <&emmc_ldo_en_default_mode>; 90 + }; 91 + 92 + /* 93 + * External Ricoh RP152L010B-TR LCD LDO regulator for the display. 94 + * LCD_PWR_EN controls both the 3.0V output. 95 + */ 96 + lcd_3v0_reg: regulator-gpio-lcd-3v0 { 97 + compatible = "regulator-fixed"; 98 + /* Supplied in turn by VBAT */ 99 + regulator-name = "VREG_LCD_3.0V"; 100 + regulator-min-microvolt = <3000000>; 101 + regulator-max-microvolt = <3000000>; 102 + /* GPIO219 controls this regulator */ 103 + gpio = <&gpio6 27 GPIO_ACTIVE_HIGH>; 104 + enable-active-high; 105 + pinctrl-names = "default"; 106 + pinctrl-0 = <&lcd_pwr_en_default_mode>; 107 + }; 108 + 109 + /* 110 + * This regulator is a GPIO line that drives the Broadcom WLAN 111 + * line WL_REG_ON high and enables the internal regulators 112 + * inside the chip. Unfortunatley it is erroneously named 113 + * WLAN_RST_N on the schematic but it is not a reset line. 114 + * 115 + * The voltage specified here is only used to determine the OCR mask, 116 + * the for the SDIO connector, the chip is actually connected 117 + * directly to VBAT. 118 + */ 119 + wl_reg: regulator-gpio-wlan { 120 + compatible = "regulator-fixed"; 121 + regulator-name = "WL_REG_ON"; 122 + regulator-min-microvolt = <3000000>; 123 + regulator-max-microvolt = <3000000>; 124 + startup-delay-us = <100000>; 125 + /* GPIO215 (WLAN_RST_N to WL_REG_ON) */ 126 + gpio = <&gpio6 23 GPIO_ACTIVE_HIGH>; 127 + enable-active-high; 128 + pinctrl-names = "default"; 129 + pinctrl-0 = <&wlan_ldo_en_default>; 130 + }; 131 + 132 + vibrator { 133 + compatible = "gpio-vibrator"; 134 + /* GPIO195 "MOT_EN" */ 135 + enable-gpios = <&gpio6 3 GPIO_ACTIVE_HIGH>; 136 + pinctrl-names = "default"; 137 + pinctrl-0 = <&vibrator_default>; 138 + }; 139 + 140 + gpio-keys { 141 + compatible = "gpio-keys"; 142 + pinctrl-names = "default"; 143 + pinctrl-0 = <&gpio_keys_default_mode>; 144 + 145 + button-home { 146 + linux,code = <KEY_HOME>; 147 + label = "HOME"; 148 + /* GPIO91 */ 149 + gpios = <&gpio2 27 GPIO_ACTIVE_LOW>; 150 + }; 151 + button-volup { 152 + linux,code = <KEY_VOLUMEUP>; 153 + label = "VOL+"; 154 + /* GPIO67 */ 155 + gpios = <&gpio2 3 GPIO_ACTIVE_LOW>; 156 + }; 157 + button-voldown { 158 + linux,code = <KEY_VOLUMEDOWN>; 159 + label = "VOL-"; 160 + /* GPIO92 */ 161 + gpios = <&gpio2 28 GPIO_ACTIVE_LOW>; 162 + }; 163 + }; 164 + 165 + led-touchkeys { 166 + compatible = "regulator-led"; 167 + vled-supply = <&ab8500_ldo_aux4_reg>; // 3.3V 168 + default-state = "on"; 169 + function = LED_FUNCTION_KBD_BACKLIGHT; 170 + color = <LED_COLOR_ID_WHITE>; 171 + }; 172 + 173 + ktd253: backlight { 174 + compatible = "kinetic,ktd253"; 175 + /* GPIO69 is used on Codina R0.4 and Codina TMO */ 176 + enable-gpios = <&gpio2 5 GPIO_ACTIVE_HIGH>; 177 + /* Default to 13/32 brightness */ 178 + default-brightness = <13>; 179 + pinctrl-names = "default"; 180 + pinctrl-0 = <&ktd253_backlight_default_mode>; 181 + }; 182 + 183 + /* Richtek RT8515GQW Flash LED Driver IC */ 184 + flash { 185 + compatible = "richtek,rt8515"; 186 + /* GPIO 140 */ 187 + enf-gpios = <&gpio4 12 GPIO_ACTIVE_HIGH>; 188 + /* GPIO 141 */ 189 + ent-gpios = <&gpio4 13 GPIO_ACTIVE_HIGH>; 190 + /* 191 + * RFS is 16 kOhm and RTS is 100 kOhm giving 192 + * the flash max current 343mA and torch max 193 + * current 55 mA. 194 + */ 195 + richtek,rfs-ohms = <16000>; 196 + richtek,rts-ohms = <100000>; 197 + pinctrl-names = "default"; 198 + pinctrl-0 = <&gpio_flash_default_mode>; 199 + 200 + led { 201 + function = LED_FUNCTION_FLASH; 202 + color = <LED_COLOR_ID_WHITE>; 203 + flash-max-timeout-us = <250000>; 204 + flash-max-microamp = <343750>; 205 + led-max-microamp = <55000>; 206 + }; 207 + }; 208 + 209 + /* Bit-banged I2C on GPIO143 and GPIO144 also called "SUBPMU I2C" */ 210 + i2c-gpio-0 { 211 + compatible = "i2c-gpio"; 212 + sda-gpios = <&gpio4 16 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>; 213 + scl-gpios = <&gpio4 15 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>; 214 + pinctrl-names = "default"; 215 + pinctrl-0 = <&i2c_gpio_0_default>; 216 + #address-cells = <1>; 217 + #size-cells = <0>; 218 + 219 + /* TODO: this should also be used by the SM5103 Camera power management unit */ 220 + }; 221 + 222 + /* Bit-banged I2C on GPIO151 and GPIO152 also called "COMP I2C" */ 223 + i2c-gpio-1 { 224 + compatible = "i2c-gpio"; 225 + sda-gpios = <&gpio4 24 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>; 226 + scl-gpios = <&gpio4 23 (GPIO_ACTIVE_HIGH|GPIO_OPEN_DRAIN)>; 227 + pinctrl-names = "default"; 228 + pinctrl-0 = <&i2c_gpio_1_default>; 229 + #address-cells = <1>; 230 + #size-cells = <0>; 231 + 232 + magnetometer@c { 233 + compatible = "alps,hscdtd008a"; 234 + reg = <0x0c>; 235 + clock-frequency = <400000>; 236 + 237 + avdd-supply = <&ab8500_ldo_aux1_reg>; // 3V 238 + dvdd-supply = <&ab8500_ldo_aux8_reg>; // 1.8V 239 + }; 240 + }; 241 + 242 + spi-gpio-0 { 243 + compatible = "spi-gpio"; 244 + /* Clock on GPIO220, pin SCL */ 245 + sck-gpios = <&gpio6 28 GPIO_ACTIVE_HIGH>; 246 + /* MOSI on GPIO224, pin SDI "slave data in" */ 247 + mosi-gpios = <&gpio7 0 GPIO_ACTIVE_HIGH>; 248 + /* MISO on GPIO225, pin SDO "slave data out" */ 249 + miso-gpios = <&gpio7 1 GPIO_ACTIVE_HIGH>; 250 + /* Chip select on GPIO201 */ 251 + cs-gpios = <&gpio6 9 GPIO_ACTIVE_LOW>; 252 + num-chipselects = <1>; 253 + 254 + pinctrl-names = "default"; 255 + pinctrl-0 = <&spi_gpio_0_default>; 256 + #address-cells = <1>; 257 + #size-cells = <0>; 258 + 259 + panel@0 { 260 + compatible = "samsung,s6d27a1"; 261 + spi-max-frequency = <1200000>; 262 + /* TYPE 3: inverse clock polarity and phase */ 263 + spi-cpha; 264 + spi-cpol; 265 + 266 + reg = <0>; 267 + vci-supply = <&lcd_3v0_reg>; 268 + vccio-supply = <&ab8500_ldo_aux6_reg>; 269 + 270 + /* Reset on GPIO139 */ 271 + reset-gpios = <&gpio4 11 GPIO_ACTIVE_LOW>; 272 + /* LCD_VGH/LCD_DETECT, ESD IRQ on GPIO93 */ 273 + interrupt-parent = <&gpio2>; 274 + interrupts = <29 IRQ_TYPE_EDGE_RISING>; 275 + 276 + pinctrl-names = "default"; 277 + pinctrl-0 = <&panel_default_mode>; 278 + backlight = <&ktd253>; 279 + 280 + port { 281 + panel_in: endpoint { 282 + remote-endpoint = <&display_out>; 283 + }; 284 + }; 285 + }; 286 + }; 287 + 288 + soc { 289 + /* External Micro SD slot */ 290 + mmc@80126000 { 291 + arm,primecell-periphid = <0x10480180>; 292 + max-frequency = <100000000>; 293 + bus-width = <4>; 294 + cap-sd-highspeed; 295 + cap-mmc-highspeed; 296 + st,sig-pin-fbclk; 297 + full-pwr-cycle; 298 + /* MMC is powered by AUX3 1.2V .. 2.91V */ 299 + vmmc-supply = <&ab8500_ldo_aux3_reg>; 300 + /* 2.9 V level translator is using AUX3 at 2.9 V as well */ 301 + vqmmc-supply = <&sd_level_translator>; 302 + pinctrl-names = "default", "sleep"; 303 + pinctrl-0 = <&mc0_a_2_default>; 304 + pinctrl-1 = <&mc0_a_2_sleep>; 305 + cd-gpios = <&gpio6 25 GPIO_ACTIVE_LOW>; // GPIO217 306 + status = "okay"; 307 + }; 308 + 309 + /* WLAN SDIO channel */ 310 + mmc@80118000 { 311 + arm,primecell-periphid = <0x10480180>; 312 + max-frequency = <50000000>; 313 + bus-width = <4>; 314 + non-removable; 315 + cap-sd-highspeed; 316 + pinctrl-names = "default", "sleep"; 317 + pinctrl-0 = <&mc1_a_2_default>; 318 + pinctrl-1 = <&mc1_a_2_sleep>; 319 + /* 320 + * GPIO-controlled voltage enablement: this drives 321 + * the WL_REG_ON line high when we use this device. 322 + * Represented as regulator to fill OCR mask. 323 + */ 324 + vmmc-supply = <&wl_reg>; 325 + 326 + #address-cells = <1>; 327 + #size-cells = <0>; 328 + status = "okay"; 329 + 330 + wifi@1 { 331 + compatible = "brcm,bcm4334-fmac", "brcm,bcm4329-fmac"; 332 + reg = <1>; 333 + /* GPIO216 WL_HOST_WAKE */ 334 + interrupt-parent = <&gpio6>; 335 + interrupts = <24 IRQ_TYPE_EDGE_FALLING>; 336 + interrupt-names = "host-wake"; 337 + pinctrl-names = "default"; 338 + pinctrl-0 = <&wlan_default_mode>; 339 + }; 340 + }; 341 + 342 + /* eMMC */ 343 + mmc@80005000 { 344 + arm,primecell-periphid = <0x10480180>; 345 + max-frequency = <100000000>; 346 + bus-width = <8>; 347 + non-removable; 348 + cap-mmc-highspeed; 349 + mmc-ddr-1_8v; 350 + no-sdio; 351 + no-sd; 352 + vmmc-supply = <&ldo_3v3_reg>; 353 + pinctrl-names = "default", "sleep"; 354 + /* 355 + * GPIO130 will be set to input no pull-up resulting in a resistor 356 + * pulling the reset high and taking the memory out of reset. 357 + */ 358 + pinctrl-0 = <&mc2_a_1_default>; 359 + pinctrl-1 = <&mc2_a_1_sleep>; 360 + status = "okay"; 361 + }; 362 + 363 + /* GBF (Bluetooth) UART */ 364 + uart@80120000 { 365 + pinctrl-names = "default", "sleep"; 366 + pinctrl-0 = <&u0_a_1_default>; 367 + pinctrl-1 = <&u0_a_1_sleep>; 368 + status = "okay"; 369 + 370 + bluetooth { 371 + /* BCM4334B0 actually */ 372 + compatible = "brcm,bcm4330-bt"; 373 + /* GPIO222 rail BT_VREG_EN to BT_REG_ON */ 374 + shutdown-gpios = <&gpio6 30 GPIO_ACTIVE_HIGH>; 375 + /* BT_WAKE on GPIO199 */ 376 + device-wakeup-gpios = <&gpio6 7 GPIO_ACTIVE_HIGH>; 377 + /* BT_HOST_WAKE on GPIO97 */ 378 + /* FIXME: convert to interrupt */ 379 + host-wakeup-gpios = <&gpio3 1 GPIO_ACTIVE_HIGH>; 380 + /* BT_RST_N on GPIO209 */ 381 + reset-gpios = <&gpio6 17 GPIO_ACTIVE_LOW>; 382 + pinctrl-names = "default"; 383 + pinctrl-0 = <&bluetooth_default_mode>; 384 + }; 385 + }; 386 + 387 + /* GPS UART */ 388 + uart@80121000 { 389 + status = "okay"; 390 + pinctrl-names = "default", "sleep"; 391 + /* CTS/RTS is not used, CTS is repurposed as GPIO */ 392 + pinctrl-0 = <&u1rxtx_a_1_default>; 393 + pinctrl-1 = <&u1rxtx_a_1_sleep>; 394 + /* FIXME: add a device for the GPS here */ 395 + }; 396 + 397 + /* Debugging console UART connected to AB8505 */ 398 + uart@80007000 { 399 + status = "okay"; 400 + pinctrl-names = "default", "sleep"; 401 + pinctrl-0 = <&u2rxtx_c_1_default>; 402 + pinctrl-1 = <&u2rxtx_c_1_sleep>; 403 + }; 404 + 405 + prcmu@80157000 { 406 + ab8505 { 407 + phy { 408 + pinctrl-names = "default", "sleep"; 409 + pinctrl-0 = <&usb_a_1_default>; 410 + pinctrl-1 = <&usb_a_1_sleep>; 411 + }; 412 + 413 + ab8500_fg { 414 + line-impedance-micro-ohms = <36000>; 415 + }; 416 + 417 + /* This is mostly identical to the Codina v0.4 regulators */ 418 + regulator { 419 + ab8500_ldo_aux1 { 420 + regulator-name = "v-sensors-vdd"; 421 + regulator-min-microvolt = <3000000>; 422 + regulator-max-microvolt = <3300000>; 423 + }; 424 + 425 + ab8500_ldo_aux2 { 426 + regulator-name = "v-aux2"; 427 + regulator-min-microvolt = <3300000>; 428 + regulator-max-microvolt = <3300000>; 429 + }; 430 + 431 + ab8500_ldo_aux3 { 432 + regulator-name = "v-mmc-sd"; 433 + }; 434 + 435 + ab8500_ldo_aux4 { 436 + regulator-name = "v-aux4"; 437 + /* 438 + * Providing some span here makes the touchkey 439 + * LEDs actually dimmable. 440 + */ 441 + regulator-min-microvolt = <1100000>; 442 + regulator-max-microvolt = <3300000>; 443 + }; 444 + 445 + ab8500_ldo_aux5 { 446 + regulator-name = "v-aux5"; 447 + regulator-min-microvolt = <1800000>; 448 + regulator-max-microvolt = <1800000>; 449 + }; 450 + 451 + ab8500_ldo_aux6 { 452 + /* 1.8 V to the display */ 453 + regulator-name = "v-aux6"; 454 + regulator-min-microvolt = <1800000>; 455 + regulator-max-microvolt = <1800000>; 456 + }; 457 + 458 + ab8500_ldo_aux8 { 459 + regulator-name = "v-sensors-vio"; 460 + }; 461 + }; 462 + }; 463 + }; 464 + 465 + /* I2C0 also known as "AGC I2C" */ 466 + i2c@80004000 { 467 + status = "okay"; 468 + pinctrl-names = "default", "sleep"; 469 + pinctrl-0 = <&i2c0_a_1_default>; 470 + pinctrl-1 = <&i2c0_a_1_sleep>; 471 + 472 + proximity@39 { 473 + /* Codina has the Amstaos TMD2672 */ 474 + compatible = "amstaos,tmd2672"; 475 + clock-frequency = <400000>; 476 + reg = <0x39>; 477 + 478 + /* IRQ on GPIO146 "PS_INT" */ 479 + interrupt-parent = <&gpio4>; 480 + interrupts = <18 IRQ_TYPE_EDGE_FALLING>; 481 + vdd-supply = <&ab8500_ldo_aux1_reg>; 482 + vddio-supply = <&ab8500_ldo_aux8_reg>; 483 + pinctrl-names = "default"; 484 + pinctrl-0 = <&tmd2672_codina_default>; 485 + }; 486 + }; 487 + 488 + /* I2C2 on GPIO10 and GPIO11 also called "SENSORS I2C" */ 489 + i2c@80128000 { 490 + status = "okay"; 491 + pinctrl-names = "default", "sleep"; 492 + pinctrl-0 = <&i2c2_b_2_default>; 493 + pinctrl-1 = <&i2c2_b_2_sleep>; 494 + 495 + /* Bosch BMA254 accelerometer */ 496 + accelerometer@18 { 497 + compatible = "bosch,bma254"; 498 + reg = <0x18>; 499 + mount-matrix = "0", "1", "0", 500 + "-1", "0", "0", 501 + "0", "0", "1"; 502 + vddio-supply = <&ab8500_ldo_aux8_reg>; // 1.8V 503 + vdd-supply = <&ab8500_ldo_aux1_reg>; // 3V 504 + }; 505 + }; 506 + 507 + /* I2C3 */ 508 + i2c@80110000 { 509 + status = "okay"; 510 + 511 + pinctrl-names = "default", "sleep"; 512 + pinctrl-0 = <&i2c3_c_2_default>; 513 + pinctrl-1 = <&i2c3_c_2_sleep>; 514 + 515 + /* TODO: write bindings and driver for this touchscreen */ 516 + 517 + /* Zinitix BT404 ISP part */ 518 + isp@50 { 519 + compatible = "zinitix,bt404-isp"; 520 + reg = <0x50>; 521 + pinctrl-names = "default"; 522 + pinctrl-0 = <&tsp_default>; 523 + }; 524 + 525 + /* Zinitix BT404 touchscreen, also has the touchkeys for menu and back */ 526 + touchscreen@20 { 527 + compatible = "zinitix,bt404"; 528 + reg = <0x20>; 529 + /* GPIO218 (TSP_INT_1V8) */ 530 + interrupt-parent = <&gpio6>; 531 + interrupts = <26 IRQ_TYPE_EDGE_FALLING>; 532 + vcca-supply = <&ab8500_ldo_aux2_reg>; // 3.3V 533 + vdd-supply = <&ab8500_ldo_aux5_reg>; // 1.8V 534 + zinitix,mode = <2>; 535 + touchscreen-size-x = <480>; 536 + touchscreen-size-y = <800>; 537 + pinctrl-names = "default"; 538 + pinctrl-0 = <&tsp_default>; 539 + }; 540 + }; 541 + 542 + mcde@a0350000 { 543 + status = "okay"; 544 + pinctrl-names = "default"; 545 + pinctrl-0 = <&dpi_default_mode>; 546 + 547 + port { 548 + display_out: endpoint { 549 + remote-endpoint = <&panel_in>; 550 + }; 551 + }; 552 + }; 553 + }; 554 + }; 555 + 556 + &pinctrl { 557 + /* 558 + * This extends the MC0_A_2 default config to include 559 + * the card detect GPIO217 line. 560 + */ 561 + sdi0 { 562 + mc0_a_2_default { 563 + default_cfg4 { 564 + pins = "GPIO217_AH12"; /* card detect */ 565 + ste,config = <&gpio_in_pd>; 566 + }; 567 + }; 568 + }; 569 + sdi2 { 570 + /* 571 + * GPIO130 should be set in GPIO mode and 572 + * pulled down. (Not connected.) 573 + */ 574 + mc2_a_1_default { 575 + default_cfg2 { 576 + pins = "GPIO130_C8"; /* FBCLK */ 577 + ste,config = <&gpio_in_pd>; 578 + }; 579 + }; 580 + }; 581 + /* GPIO that enables the 2.9V SD card level translator */ 582 + sd-level-translator { 583 + sd_level_translator_default: sd_level_translator_default { 584 + /* level shifter on GPIO87 */ 585 + codina_cfg1 { 586 + pins = "GPIO87_B3"; 587 + ste,config = <&gpio_out_hi>; 588 + }; 589 + }; 590 + }; 591 + /* GPIO that enables the LDO regulator for the eMMC */ 592 + emmc-ldo { 593 + emmc_ldo_en_default_mode: emmc_ldo_default { 594 + /* LDO enable on GPIO223 */ 595 + codina_cfg1 { 596 + pins = "GPIO223_AH9"; 597 + ste,config = <&gpio_out_hi>; 598 + }; 599 + }; 600 + }; 601 + /* GPIOs for panel control */ 602 + panel { 603 + panel_default_mode: panel_default { 604 + codina_cfg1 { 605 + /* Reset line */ 606 + pins = "GPIO139_C9"; 607 + ste,config = <&gpio_out_lo>; 608 + }; 609 + codina_cfg2 { 610 + /* ESD IRQ line "LCD detect" */ 611 + pins = "GPIO93_B7"; 612 + ste,config = <&gpio_in_nopull>; 613 + }; 614 + }; 615 + }; 616 + /* GPIO that enables the LDO regulator for the LCD display */ 617 + lcd-ldo { 618 + lcd_pwr_en_default_mode: lcd_pwr_en_default { 619 + /* LCD_PWR_EN on GPIO219 */ 620 + codina_cfg1 { 621 + pins = "GPIO219_AG10"; 622 + ste,config = <&gpio_out_hi>; 623 + }; 624 + }; 625 + }; 626 + /* GPIO that enables the WLAN internal LDO regulators */ 627 + wlan-ldo { 628 + wlan_ldo_en_default: wlan_ldo_default { 629 + /* GPIO215 named WLAN_RST_N */ 630 + codina_cfg1 { 631 + pins = "GPIO215_AH13"; 632 + ste,config = <&gpio_out_lo>; 633 + }; 634 + }; 635 + }; 636 + /* Backlight GPIO */ 637 + backlight { 638 + ktd253_backlight_default_mode: backlight_default { 639 + skomer_cfg1 { 640 + pins = "GPIO69_E2"; /* LCD_BL_CTRL */ 641 + ste,config = <&gpio_out_lo>; 642 + }; 643 + }; 644 + }; 645 + /* Flash and torch */ 646 + flash { 647 + gpio_flash_default_mode: flash_default { 648 + codina_cfg1 { 649 + pins = "GPIO140_B11", "GPIO141_C12"; 650 + ste,config = <&gpio_out_lo>; 651 + }; 652 + }; 653 + }; 654 + /* GPIO keys */ 655 + gpio-keys { 656 + gpio_keys_default_mode: gpio_keys_default { 657 + skomer_cfg1 { 658 + pins = "GPIO67_G2", /* VOL UP */ 659 + "GPIO91_B6", /* HOME */ 660 + "GPIO92_D6"; /* VOL DOWN */ 661 + ste,config = <&gpio_in_pu>; 662 + }; 663 + }; 664 + }; 665 + /* Interrupt line for the Zinitix BT404 touchscreen */ 666 + tsp { 667 + tsp_default: tsp_default { 668 + codina_cfg1 { 669 + pins = "GPIO218_AH11"; /* TSP_INT_1V8 */ 670 + ste,config = <&gpio_in_nopull>; 671 + }; 672 + }; 673 + }; 674 + /* Interrupt line for light/proximity sensor TMD2672 */ 675 + tmd2672 { 676 + tmd2672_codina_default: tmd2672_codina { 677 + codina_cfg1 { 678 + pins = "GPIO146_D13"; 679 + ste,config = <&gpio_in_nopull>; 680 + }; 681 + }; 682 + }; 683 + /* GPIO-based I2C bus for subpmu */ 684 + i2c-gpio-0 { 685 + i2c_gpio_0_default: i2c_gpio_0 { 686 + codina_cfg1 { 687 + pins = "GPIO143_D12", "GPIO144_B13"; 688 + ste,config = <&gpio_in_nopull>; 689 + }; 690 + }; 691 + }; 692 + /* GPIO-based I2C bus for the NFC */ 693 + i2c-gpio-1 { 694 + i2c_gpio_1_default: i2c_gpio_1 { 695 + codina_cfg1 { 696 + pins = "GPIO151_D17", "GPIO152_D16"; 697 + ste,config = <&gpio_in_nopull>; 698 + }; 699 + }; 700 + }; 701 + /* GPIO-based SPI bus for the display */ 702 + spi-gpio-0 { 703 + spi_gpio_0_default: spi_gpio_0_d { 704 + codina_cfg1 { 705 + pins = "GPIO220_AH10", "GPIO201_AF24", "GPIO224_AG9"; 706 + ste,config = <&gpio_out_hi>; 707 + }; 708 + codina_cfg2 { 709 + pins = "GPIO225_AG8"; 710 + /* Needs pull down, no pull down resistor on board */ 711 + ste,config = <&gpio_in_pd>; 712 + }; 713 + }; 714 + spi_gpio_0_sleep: spi_gpio_0_s { 715 + codina_cfg1 { 716 + pins = "GPIO220_AH10", "GPIO201_AF24", 717 + "GPIO224_AG9", "GPIO225_AG8"; 718 + ste,config = <&gpio_out_hi>; 719 + }; 720 + }; 721 + }; 722 + wlan { 723 + wlan_default_mode: wlan_default { 724 + /* GPIO216 for WL_HOST_WAKE */ 725 + codina_cfg2 { 726 + pins = "GPIO216_AG12"; 727 + ste,config = <&gpio_in_pd>; 728 + }; 729 + }; 730 + }; 731 + bluetooth { 732 + bluetooth_default_mode: bluetooth_default { 733 + /* GPIO199 BT_WAKE and GPIO222 BT_VREG_ON */ 734 + codina_cfg1 { 735 + pins = "GPIO199_AH23", "GPIO222_AJ9"; 736 + ste,config = <&gpio_out_lo>; 737 + }; 738 + /* GPIO97 BT_HOST_WAKE */ 739 + codina_cfg2 { 740 + pins = "GPIO97_D9"; 741 + ste,config = <&gpio_in_nopull>; 742 + }; 743 + /* GPIO209 BT_RST_N */ 744 + codina_cfg3 { 745 + pins = "GPIO209_AG15"; 746 + ste,config = <&gpio_out_hi>; 747 + }; 748 + }; 749 + }; 750 + vibrator { 751 + vibrator_default: vibrator_default { 752 + codina_cfg1 { 753 + pins = "GPIO195_AG28"; /* MOT_EN */ 754 + ste,config = <&gpio_out_lo>; 755 + }; 756 + }; 757 + }; 758 + mcde { 759 + dpi_default_mode: dpi_default { 760 + default_mux1 { 761 + /* Mux in all the data lines */ 762 + function = "lcd"; 763 + groups = 764 + /* Data lines D0-D7 GPIO70..GPIO77 */ 765 + "lcd_d0_d7_a_1", 766 + /* Data lines D8-D11 GPIO78..GPIO81 */ 767 + "lcd_d8_d11_a_1", 768 + /* Data lines D12-D15 GPIO82..GPIO85 */ 769 + "lcd_d12_d15_a_1", 770 + /* Data lines D16-D23 GPIO161..GPIO168 */ 771 + "lcd_d16_d23_b_1"; 772 + }; 773 + default_mux2 { 774 + function = "lcda"; 775 + /* Clock line on GPIO150, DE, VSO, HSO on GPIO169..GPIO171 */ 776 + groups = "lcdaclk_b_1", "lcda_b_1"; 777 + }; 778 + /* Input, no pull-up is the default state for pins used for an alt function */ 779 + default_cfg1 { 780 + pins = "GPIO150_C14", "GPIO169_D22", "GPIO170_C23", "GPIO171_D23"; 781 + ste,config = <&in_nopull>; 782 + }; 783 + }; 784 + }; 785 + };
+70 -10
arch/arm/boot/dts/ste-ux500-samsung-codina.dts
··· 9 9 * the boot loader. 10 10 * 11 11 * The Samsung tree further talks about GT-I8160P and GT-I8160chn (China). 12 - * The GT-I8160 plain is knonw as the "europe" variant. 13 - * The GT-I8160P appears to not use the ST Microelectronics accelerometer. 12 + * The GT-I8160 plain is known as the "europe" variant. 13 + * The GT-I8160P is the CDMA version and it appears to not use the ST 14 + * Microelectronics accelerometer and reportedly has NFC mounted. 14 15 * The GT-I8160chn appears to be the same as the europe variant. 16 + * 17 + * There is also the Codina-TMO, Samsung SGH-T599, which has its own device 18 + * tree. 15 19 */ 16 20 17 21 /dts-v1/; ··· 307 303 #address-cells = <1>; 308 304 #size-cells = <0>; 309 305 310 - /* TODO: add the NFC chip here */ 306 + nfc@2b { 307 + /* NXP NFC circuit PN544 C1 marked NXP 44501 */ 308 + compatible = "nxp,pn544-i2c"; 309 + /* IF0, IF1 high, gives I2C address 0x2B */ 310 + reg = <0x2b>; 311 + clock-frequency = <400000>; 312 + /* NFC IRQ on GPIO32 */ 313 + interrupt-parent = <&gpio1>; 314 + interrupts = <0 IRQ_TYPE_EDGE_FALLING>; 315 + /* GPIO 31 */ 316 + firmware-gpios = <&gpio0 31 GPIO_ACTIVE_HIGH>; 317 + /* GPIO88 */ 318 + enable-gpios = <&gpio2 24 GPIO_ACTIVE_HIGH>; 319 + pinctrl-names = "default"; 320 + pinctrl-0 = <&pn544_codina_default>; 321 + }; 311 322 }; 312 323 313 324 spi-gpio-0 { ··· 480 461 uart@80121000 { 481 462 status = "okay"; 482 463 pinctrl-names = "default", "sleep"; 483 - /* CTS/RTS is not used, CTS is repurposed as GPIO */ 484 - pinctrl-0 = <&u1rxtx_a_1_default>; 485 - pinctrl-1 = <&u1rxtx_a_1_sleep>; 486 - /* FIXME: add a device for the GPS here */ 464 + pinctrl-0 = <&u1rxtx_a_1_default &u1ctsrts_a_1_default>; 465 + pinctrl-1 = <&u1rxtx_a_1_sleep &u1ctsrts_a_1_sleep>; 466 + 467 + gnss { 468 + compatible = "brcm,bcm4751"; 469 + /* GPS_RSTN on GPIO21 */ 470 + reset-gpios = <&gpio0 21 GPIO_ACTIVE_LOW>; 471 + /* GPS_ON_OFF on GPIO86 */ 472 + enable-gpios = <&gpio2 22 GPIO_ACTIVE_HIGH>; 473 + /* GPS_1V8 (VSMPS2) */ 474 + vddio-supply = <&db8500_vsmps2_reg>; 475 + pinctrl-names = "default"; 476 + pinctrl-0 = <&bcm4751_codina_default>; 477 + }; 487 478 }; 488 479 489 480 /* Debugging console UART connected to TSU6111RSVR (FSA880) */ ··· 510 481 pinctrl-names = "default", "sleep"; 511 482 pinctrl-0 = <&usb_a_1_default>; 512 483 pinctrl-1 = <&usb_a_1_sleep>; 484 + }; 485 + 486 + ab8500_fg { 487 + line-impedance-micro-ohms = <36000>; 513 488 }; 514 489 515 490 regulator { ··· 548 515 pinctrl-0 = <&i2c0_a_1_default>; 549 516 pinctrl-1 = <&i2c0_a_1_sleep>; 550 517 551 - /* TODO: write bindings and driver for this proximity sensor */ 552 518 proximity@39 { 553 - /* Codina has the Mouser TMD2672 */ 554 - compatible = "mouser,tmd2672"; 519 + /* Codina has the Amstaos TMD2672 */ 520 + compatible = "amstaos,tmd2672"; 555 521 clock-frequency = <400000>; 556 522 reg = <0x39>; 557 523 ··· 876 844 /* GPIO95 used for IRQ */ 877 845 pins = "GPIO95_E8"; 878 846 ste,config = <&gpio_in_nopull>; 847 + }; 848 + }; 849 + }; 850 + nfc { 851 + pn544_codina_default: pn544_codina { 852 + /* Interrupt line */ 853 + codina_cfg1 { 854 + pins = "GPIO32_V2"; 855 + ste,config = <&gpio_in_nopull>; 856 + }; 857 + /* Enable and firmware GPIOs */ 858 + codina_cfg2 { 859 + pins = "GPIO31_V3", "GPIO88_C4"; 860 + ste,config = <&gpio_out_lo>; 861 + }; 862 + }; 863 + }; 864 + bcm4751 { 865 + bcm4751_codina_default: bcm4751_codina { 866 + /* Reset line, start out asserted */ 867 + codina_cfg1 { 868 + pins = "GPIO21_AB3"; 869 + ste,config = <&gpio_out_lo>; 870 + }; 871 + /* GPS_ON_OFF, start out deasserted (off) */ 872 + codina_cfg2 { 873 + pins = "GPIO86_C6"; 874 + ste,config = <&gpio_out_lo>; 879 875 }; 880 876 }; 881 877 };
+4
arch/arm/boot/dts/ste-ux500-samsung-gavini.dts
··· 456 456 pinctrl-1 = <&usb_a_1_sleep>; 457 457 }; 458 458 459 + ab8500_fg { 460 + line-impedance-micro-ohms = <43000>; 461 + }; 462 + 459 463 regulator { 460 464 ab8500_ldo_aux1 { 461 465 /* Used for VDD for sensors */
+4
arch/arm/boot/dts/ste-ux500-samsung-golden.dts
··· 304 304 pinctrl-1 = <&usb_a_1_sleep>; 305 305 }; 306 306 307 + ab8500_fg { 308 + line-impedance-micro-ohms = <36000>; 309 + }; 310 + 307 311 regulator { 308 312 ab8500_ldo_aux1 { 309 313 regulator-name = "sensor_3v";
+43 -1
arch/arm/boot/dts/ste-ux500-samsung-janice.dts
··· 485 485 /* CTS/RTS is not used, CTS is repurposed as GPIO */ 486 486 pinctrl-0 = <&u1rxtx_a_1_default>; 487 487 pinctrl-1 = <&u1rxtx_a_1_sleep>; 488 - /* FIXME: add a device for the GPS here */ 488 + 489 + gnss { 490 + /* 491 + * The Low Noise Amplifier (LNA) power and enablement is controlled 492 + * autonomously by the GSD4t. 493 + * Janice has a SiRFstarIV-based GSD4t 494 + * Golden has a SiRFstarV 5t-based CSRG05TA03-ICJE-R. 495 + */ 496 + compatible = "csr,gsd4t"; 497 + /* GPS_RSTN on GPIO21 */ 498 + reset-gpios = <&gpio0 21 GPIO_ACTIVE_LOW>; 499 + /* GPS_ON_OFF on GPIO96 */ 500 + sirf,onoff-gpios = <&gpio3 0 GPIO_ACTIVE_HIGH>; 501 + /* GPS_1V8 (VSMPS2) */ 502 + vcc-supply = <&db8500_vsmps2_reg>; 503 + pinctrl-names = "default"; 504 + pinctrl-0 = <&gsd4t_janice_default>; 505 + /* According to /etc/sirfgps.conf */ 506 + current-speed = <460800>; 507 + }; 489 508 }; 490 509 491 510 /* Debugging console UART connected to TSU6111RSVR (FSA880) */ ··· 521 502 pinctrl-names = "default", "sleep"; 522 503 pinctrl-0 = <&usb_a_1_default>; 523 504 pinctrl-1 = <&usb_a_1_sleep>; 505 + }; 506 + 507 + ab8500_fg { 508 + line-impedance-micro-ohms = <15000>; 524 509 }; 525 510 526 511 regulator { ··· 961 938 janice_cfg2 { 962 939 pins = "GPIO31_V3", "GPIO88_C4"; 963 940 ste,config = <&gpio_out_lo>; 941 + }; 942 + }; 943 + }; 944 + gsd4t { 945 + gsd4t_janice_default: gsd4t_janice { 946 + /* Reset line, start out asserted */ 947 + janice_cfg1 { 948 + pins = "GPIO21_AB3"; 949 + ste,config = <&gpio_out_lo>; 950 + }; 951 + /* GPS_ON_OFF, start out deasserted (off) */ 952 + janice_cfg2 { 953 + pins = "GPIO96_D8"; 954 + ste,config = <&gpio_out_lo>; 955 + }; 956 + /* Unused power enablement line, used in R0.0 and R0.1 boards */ 957 + janice_cfg3 { 958 + pins = "GPIO86_C6"; 959 + ste,config = <&gpio_in_pd>; 964 960 }; 965 961 }; 966 962 };
+4
arch/arm/boot/dts/ste-ux500-samsung-kyle.dts
··· 325 325 pinctrl-1 = <&usb_a_1_sleep>; 326 326 }; 327 327 328 + ab8500_fg { 329 + line-impedance-micro-ohms = <36000>; 330 + }; 331 + 328 332 regulator { 329 333 ab8500_ldo_aux1 { 330 334 /* Used for VDD for sensors */
+34 -1
arch/arm/boot/dts/ste-ux500-samsung-skomer.dts
··· 281 281 }; 282 282 }; 283 283 284 - /* GPF UART */ 284 + /* GPS UART */ 285 285 uart@80121000 { 286 286 status = "okay"; 287 287 pinctrl-names = "default", "sleep"; 288 288 pinctrl-0 = <&u1rxtx_a_1_default &u1ctsrts_a_1_default>; 289 289 pinctrl-1 = <&u1rxtx_a_1_sleep &u1ctsrts_a_1_sleep>; 290 + 291 + gnss { 292 + /* The CSRG05TA03-ICJE-R is a SirfStarV 5t chip */ 293 + compatible = "csr,csrg05ta03-icje-r"; 294 + /* GPS_RSTN on GPIO209 */ 295 + reset-gpios = <&gpio6 17 GPIO_ACTIVE_LOW>; 296 + /* GPS_ON_OFF on GPIO86 */ 297 + sirf,onoff-gpios = <&gpio2 22 GPIO_ACTIVE_HIGH>; 298 + /* GPS_1V8 (VSMPS2) */ 299 + vcc-supply = <&db8500_vsmps2_reg>; 300 + pinctrl-names = "default"; 301 + pinctrl-0 = <&g05ta03_skomer_default>; 302 + /* According to /etc/sirfgps.conf */ 303 + current-speed = <460800>; 304 + }; 290 305 }; 291 306 292 307 /* Debugging console UART connected to AB8505 USB */ ··· 318 303 pinctrl-names = "default", "sleep"; 319 304 pinctrl-0 = <&usb_a_1_default>; 320 305 pinctrl-1 = <&usb_a_1_sleep>; 306 + }; 307 + 308 + ab8500_fg { 309 + line-impedance-micro-ohms = <16000>; 321 310 }; 322 311 323 312 regulator { ··· 665 646 skomer_cfg1 { 666 647 pins = "GPIO218_AH11"; 667 648 ste,config = <&gpio_in_nopull>; 649 + }; 650 + }; 651 + }; 652 + g05ta03 { 653 + g05ta03_skomer_default: g05ta03 { 654 + /* Reset line, start out de-asserted */ 655 + skomer_cfg1 { 656 + pins = "GPIO209_AG15"; 657 + ste,config = <&gpio_out_hi>; 658 + }; 659 + /* GPS_ON_OFF, start out deasserted (off) */ 660 + skomer_cfg2 { 661 + pins = "GPIO86_C6"; 662 + ste,config = <&gpio_out_lo>; 668 663 }; 669 664 }; 670 665 };