From efb26758213acf21fae30d58ce0c2c396416724b Mon Sep 17 00:00:00 2001 From: maoxiaochuan Date: Tue, 13 Aug 2024 09:32:49 +0800 Subject: [PATCH] update to 5625657ca598 1. lio: fix read16 use 8bit-mode 2. 2K300-PAI:add ls2k300_pai_pihat.dts and ls2k300_pai_2.dts 3. 2K300:Correct pinmux config for uart 4. 2K300:Fix Qt program is not displaying fully 5. 2K300:Canfd up to 10Mpbs 6. 2P500:EMMC use letacy interrupt controller --- .../boot/dts/loongson/loongson2k300.dtsi | 8 +- .../boot/dts/loongson/loongson2p500.dtsi | 43 ++- .../dts/loongson/loongson_panel_param.dtsi | 8 +- .../boot/dts/loongson/ls2k300_mini_dp.dts | 4 +- .../boot/dts/loongson/ls2k300_pai.dts | 35 +- .../boot/dts/loongson/ls2k300_pai_func2.dts | 298 ++++++++++++++++ .../boot/dts/loongson/ls2k300_pai_pihat.dts | 324 ++++++++++++++++++ .../boot/dts/loongson/ls2p500_gbkpjm0_v10.dts | 15 + .../boot/dts/loongson/ls2p500_rsj_mb_v10.dts | 11 + .../configs/loongson_2p500_defconfig | 6 +- drivers/misc/ls2x-lio.c | 14 +- drivers/net/can/ls_canfd/lscanfd.ko | Bin 169392 -> 169392 bytes drivers/pwm/Kconfig | 2 +- 13 files changed, 719 insertions(+), 49 deletions(-) create mode 100644 arch/loongarch/boot/dts/loongson/ls2k300_pai_func2.dts create mode 100644 arch/loongarch/boot/dts/loongson/ls2k300_pai_pihat.dts diff --git a/arch/loongarch/boot/dts/loongson/loongson2k300.dtsi b/arch/loongarch/boot/dts/loongson/loongson2k300.dtsi index a413d1db0..e54e657f8 100644 --- a/arch/loongarch/boot/dts/loongson/loongson2k300.dtsi +++ b/arch/loongarch/boot/dts/loongson/loongson2k300.dtsi @@ -106,7 +106,7 @@ }; uart5_pins: pinmux_G64_G65_as_uart5 { - pinctrl-single,bits = <0x10 0x000000a 0x0000000f>; + pinctrl-single,bits = <0x10 0x0000000a 0x0000000f>; }; uart6_pins: pinmux_G60_G61_as_uart6 { @@ -114,15 +114,15 @@ }; uart7_pins: pinmux_G68_G69_as_uart7 { - pinctrl-single,bits = <0x10 0xf0000a00 0x00000f00>; + pinctrl-single,bits = <0x10 0x00000a00 0x00000f00>; }; uart8_pins: pinmux_G70_G71_as_uart8 { - pinctrl-single,bits = <0x8 0x0f00a000 0x0f00f000>; + pinctrl-single,bits = <0x10 0x0000a000 0x0000f000>; }; uart9_pins: pinmux_G66_G67_as_uart9 { - pinctrl-single,bits = <0x10 0x000000a0 0xf00000f0>; + pinctrl-single,bits = <0x10 0x000000a0 0x000000f0>; }; gmac1_pins: pinmux_G44_G55_as_gmac1 { diff --git a/arch/loongarch/boot/dts/loongson/loongson2p500.dtsi b/arch/loongarch/boot/dts/loongson/loongson2p500.dtsi index 6ca564508..0afc7e3a3 100644 --- a/arch/loongarch/boot/dts/loongson/loongson2p500.dtsi +++ b/arch/loongarch/boot/dts/loongson/loongson2p500.dtsi @@ -278,10 +278,10 @@ pinctrl-single,bits = <0x4 0x80000000 0xc0000000>; }; prt_pwm14_pins:pinmux_prt_pwm14_pins { - pinctrl-single,bits = <0x8 0x00000020 0x0000030>; + pinctrl-single,bits = <0x8 0x00000002 0x0000003>; }; prt_pwm15_pins:pinmux_prt_pwm15_pins { - pinctrl-single,bits = <0x8 0x00000080 0x00000c0>; + pinctrl-single,bits = <0x8 0x00000008 0x000000c>; }; }; @@ -467,12 +467,12 @@ /*emmc*/ emmc0: mmc0@0x14210000 { #address-cells = <2>; - compatible = "loongson,ls2k_sdio_1.1"; + compatible = "loongson,ls2k_sdio_1.2"; reg = <0 0x14210000 0 0x1000>; - //interrupt-parent = <&icu>; - //interrupts = <13>; - interrupt-parent = <&extioiic>; - interrupts = <8>; + interrupt-parent = <&icu>; + interrupts = <13>; + //interrupt-parent = <&extioiic>; + //interrupts = <8>; interrupt-names = "ls2k_mci_irq"; dma-mask = <0xffffffff 0xffffffff>; clock-frequency = <0 200000000>; @@ -489,14 +489,14 @@ #address-cells = <2>; compatible = "loongson,ls2k_sdio_1.2"; reg = <0 0x14218000 0 0x1000>; - interrupt-parent = <&icu>; - interrupts = <13>; - //interrupt-parent = <&extioiic>; - //interrupts = <10>; + //interrupt-parent = <&icu>; + //interrupts = <13>; + interrupt-parent = <&extioiic>; + interrupts = <10>; interrupt-names = "ls2k_sdio_irq"; clock-frequency = <0 200000000>; dma-mask = <0xffffffff 0xffffffff>; - bus-width = <4>; + bus-width = <1>; cap-sd-highspeed; cap-mmc-highspeed; //no-mmc; @@ -780,6 +780,7 @@ clock-frequency = <200000000>; interrupt-parent = <&extioiic>; interrupts = <20>; + #pwm-cells = <2>; pinctrl-0 = <&pwm1_pins>; pinctrl-names = "default"; status = "disable"; @@ -791,6 +792,7 @@ clock-frequency = <200000000>; interrupt-parent = <&extioiic>; interrupts = <21>; + #pwm-cells = <2>; pinctrl-0 = <&pwm2_pins>; pinctrl-names = "default"; status = "disable"; @@ -802,6 +804,7 @@ clock-frequency = <200000000>; interrupt-parent = <&extioiic>; interrupts = <22>; + #pwm-cells = <2>; pinctrl-0 = <&pwm3_pins>; pinctrl-names = "default"; status = "disable"; @@ -814,6 +817,7 @@ clock-frequency = <200000000>; interrupt-parent = <&extioiic>; interrupts = <83>; + #pwm-cells = <2>; pinctrl-0 = <&prt_pwm0_pins>; pinctrl-names = "default"; status = "disable"; @@ -825,6 +829,7 @@ clock-frequency = <200000000>; interrupt-parent = <&extioiic>; interrupts = <83>; + #pwm-cells = <2>; pinctrl-0 = <&prt_pwm1_pins>; pinctrl-names = "default"; status = "disable"; @@ -836,6 +841,7 @@ clock-frequency = <200000000>; interrupt-parent = <&extioiic>; interrupts = <83>; + #pwm-cells = <2>; pinctrl-0 = <&prt_pwm2_pins>; pinctrl-names = "default"; status = "disable"; @@ -847,6 +853,7 @@ clock-frequency = <200000000>; interrupt-parent = <&extioiic>; interrupts = <83>; + #pwm-cells = <2>; pinctrl-0 = <&prt_pwm3_pins>; pinctrl-names = "default"; status = "disable"; @@ -858,6 +865,7 @@ clock-frequency = <200000000>; interrupt-parent = <&extioiic>; interrupts = <83>; + #pwm-cells = <2>; pinctrl-0 = <&prt_pwm4_pins>; pinctrl-names = "default"; status = "disable"; @@ -869,6 +877,7 @@ clock-frequency = <200000000>; interrupt-parent = <&extioiic>; interrupts = <83>; + #pwm-cells = <2>; pinctrl-0 = <&prt_pwm5_pins>; pinctrl-names = "default"; status = "disable"; @@ -880,6 +889,7 @@ clock-frequency = <200000000>; interrupt-parent = <&extioiic>; interrupts = <83>; + #pwm-cells = <2>; pinctrl-0 = <&prt_pwm6_pins>; pinctrl-names = "default"; status = "disable"; @@ -891,6 +901,7 @@ clock-frequency = <200000000>; interrupt-parent = <&extioiic>; interrupts = <83>; + #pwm-cells = <2>; pinctrl-0 = <&prt_pwm7_pins>; pinctrl-names = "default"; status = "disable"; @@ -902,6 +913,7 @@ clock-frequency = <200000000>; interrupt-parent = <&extioiic>; interrupts = <84>; + #pwm-cells = <2>; pinctrl-0 = <&prt_pwm8_pins>; pinctrl-names = "default"; status = "disable"; @@ -913,6 +925,7 @@ clock-frequency = <200000000>; interrupt-parent = <&extioiic>; interrupts = <84>; + #pwm-cells = <2>; pinctrl-0 = <&prt_pwm9_pins>; pinctrl-names = "default"; status = "disable"; @@ -924,6 +937,7 @@ clock-frequency = <200000000>; interrupt-parent = <&extioiic>; interrupts = <84>; + #pwm-cells = <2>; pinctrl-0 = <&prt_pwm10_pins>; pinctrl-names = "default"; status = "disable"; @@ -935,6 +949,7 @@ clock-frequency = <200000000>; interrupt-parent = <&extioiic>; interrupts = <84>; + #pwm-cells = <2>; pinctrl-0 = <&prt_pwm11_pins>; pinctrl-names = "default"; status = "disable"; @@ -946,6 +961,7 @@ clock-frequency = <200000000>; interrupt-parent = <&extioiic>; interrupts = <84>; + #pwm-cells = <2>; pinctrl-0 = <&prt_pwm12_pins>; pinctrl-names = "default"; status = "disable"; @@ -957,6 +973,7 @@ clock-frequency = <200000000>; interrupt-parent = <&extioiic>; interrupts = <84>; + #pwm-cells = <2>; pinctrl-0 = <&prt_pwm13_pins>; pinctrl-names = "default"; status = "disable"; @@ -968,6 +985,7 @@ clock-frequency = <200000000>; interrupt-parent = <&extioiic>; interrupts = <84>; + #pwm-cells = <2>; pinctrl-0 = <&prt_pwm14_pins>; pinctrl-names = "default"; status = "disable"; @@ -979,6 +997,7 @@ clock-frequency = <200000000>; interrupt-parent = <&extioiic>; interrupts = <84>; + #pwm-cells = <2>; pinctrl-0 = <&prt_pwm15_pins>; pinctrl-names = "default"; status = "disable"; diff --git a/arch/loongarch/boot/dts/loongson/loongson_panel_param.dtsi b/arch/loongarch/boot/dts/loongson/loongson_panel_param.dtsi index 7c5b0d6d9..63de5b3f3 100644 --- a/arch/loongarch/boot/dts/loongson/loongson_panel_param.dtsi +++ b/arch/loongarch/boot/dts/loongson/loongson_panel_param.dtsi @@ -27,8 +27,8 @@ }; panel-ATK-MD0430R-800x480 { - width-mm = <117>; - height-mm = <62>; + width-mm = <223>; + height-mm = <125>; label = "ATK-MD0430R-800x480"; data-mapping = "jeida-24"; @@ -50,8 +50,8 @@ }; panel-ATK-MD0700R-1024x600 { - width-mm = <180>; - height-mm = <110>; + width-mm = <223>; + height-mm = <125>; label = "ATK-MD0700R-1024x600"; data-mapping = "jeida-24"; diff --git a/arch/loongarch/boot/dts/loongson/ls2k300_mini_dp.dts b/arch/loongarch/boot/dts/loongson/ls2k300_mini_dp.dts index a16b2176f..414fd7f61 100644 --- a/arch/loongarch/boot/dts/loongson/ls2k300_mini_dp.dts +++ b/arch/loongarch/boot/dts/loongson/ls2k300_mini_dp.dts @@ -55,8 +55,8 @@ pixelclk-active = <0>; }; #else // 7' LCD - width-mm = <180>; - height-mm = <110>; + width-mm = <223>; + height-mm = <125>; label = "ATK-MD0700R-1024x600"; data-mapping = "jeida-24"; diff --git a/arch/loongarch/boot/dts/loongson/ls2k300_pai.dts b/arch/loongarch/boot/dts/loongson/ls2k300_pai.dts index 2b27505a3..73a5a73dd 100644 --- a/arch/loongarch/boot/dts/loongson/ls2k300_pai.dts +++ b/arch/loongarch/boot/dts/loongson/ls2k300_pai.dts @@ -83,8 +83,8 @@ pixelclk-active = <0>; }; #else // 7' LCD - width-mm = <180>; - height-mm = <110>; + width-mm = <223>; + height-mm = <125>; label = "ATK-MD0700R-1024x600"; data-mapping = "jeida-24"; @@ -125,24 +125,12 @@ regulator-always-on; }; - humidity_sensor { - compatible = "dht11-sensor"; - SHT11-gpios = <&gpio 61 GPIO_ACTIVE_HIGH>; - status = "okay"; - }; - // 虽然这个时钟在从模式下没用,但 es8388 驱动必须指定这个时钟 es8388_clk: es8388-clock { compatible = "fixed-clock"; clock-frequency = <11289600>; #clock-cells = <1>; }; - - onewire { - compatible = "w1-gpio"; - gpios = <&gpio 68 GPIO_ACTIVE_HIGH>; - status = "disabled"; - }; }; &uart0 { @@ -197,13 +185,12 @@ cs-gpios = <&gpio 67 0>, <&gpio 85 0>; - mcp3004@0 { - compatible = "mcp3004"; + spidev1@0 { + compatible = "rohm,dh2228fv"; reg = <0>; - spi-max-frequency = <1500000>; + spi-max-frequency = <25000000>; }; - - spidev1@1 { + spidev2@1 { compatible = "rohm,dh2228fv"; reg = <1>; spi-max-frequency = <25000000>; @@ -322,4 +309,12 @@ &sound { status = "okay"; -}; \ No newline at end of file +}; + +&pwm0 { + status = "okay"; +}; + +&pwm1 { + status = "okay"; +}; diff --git a/arch/loongarch/boot/dts/loongson/ls2k300_pai_func2.dts b/arch/loongarch/boot/dts/loongson/ls2k300_pai_func2.dts new file mode 100644 index 000000000..bb724ee1e --- /dev/null +++ b/arch/loongarch/boot/dts/loongson/ls2k300_pai_func2.dts @@ -0,0 +1,298 @@ +#include +#include +#include +#include + +#include "loongson2k300.dtsi" +#include "loongson_panel_param.dtsi" + +/ { + model = "LS2K300-PAI"; + + chosen { + stdout-path = "serial0:115200n8"; + bootargs = "earlycon"; + }; + + /* not need memory node, we get memory info from boot params. */ + //memory { + // name = "memory"; + // device_type = "memory"; + // reg = <0 0x00200000 0 0x0ee00000 + // 0 0x90000000 0 0x10000000>; + //}; + + reserved-memory { + #address-cells = <2>; + #size-cells = <2>; + ranges; + + linux,cma { + compatible = "shared-dma-pool"; + reusable; + size = <0 0x02000000>; + linux,cma-default; + }; + }; + + leds { + compatible = "gpio-leds"; + + led1 { + label = "led1"; + gpios = <&gpio 54 GPIO_ACTIVE_LOW>; + linux,default-trigger = "heartbeat"; + default-state = "on"; + }; + }; + + lcd_backlight: backlight { + compatible = "gpio-backlight"; + gpios = <&gpio 43 GPIO_ACTIVE_HIGH>; + default-on; + }; + + panel: dvo-connector@0 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "panel-lvds", "auo,b101ean01"; + backlight = <&lcd_backlight>; + + /* lcd power on control gpio */ + // enable-gpios = <&pioA 3 GPIO_ACTIVE_HIGH>; + // power-supply = <&vdd_lcd>; +#if 0 // 4.3' LCD + width-mm = <223>; + height-mm = <125>; + label = "ATK-MD0430R-800x480"; + data-mapping = "jeida-24"; + + panel-timing { + clock-frequency = <27000000>; + hactive = <800>; + vactive = <480>; + hsync-len = <40>; + hfront-porch = <48>; + hback-porch = <40>; + vfront-porch = <13>; + vback-porch = <32>; + vsync-len = <1>; + de-active = <1>; + hsync-active = <0>; + vsync-active = <0>; + pixelclk-active = <0>; + }; +#else // 7' LCD + width-mm = <223>; + height-mm = <125>; + label = "ATK-MD0700R-1024x600"; + data-mapping = "jeida-24"; + + panel-timing { + clock-frequency = <51200000>; + hactive = <1024>; + vactive = <600>; + hsync-len = <20>; + hfront-porch = <160>; + hback-porch = <140>; + vfront-porch = <12>; + vback-porch = <20>; + vsync-len = <3>; + de-active = <1>; + hsync-active = <0>; + vsync-active = <0>; + pixelclk-active = <0>; + }; +#endif + port@0 { + reg = <0>; + + #address-cells = <1>; + #size-cells = <0>; + + dvo_connector_in: endpoint@0 { + reg = <0>; + remote-endpoint = <&dc_out_rgb0>; + }; + }; + }; + + vccio_codec: 3_3V{ + compatible = "regulator-fixed"; + regulator-name = "VCC_IO"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + regulator-always-on; + }; + + // 虽然这个时钟在从模式下没用,但 es8388 驱动必须指定这个时钟 + es8388_clk: es8388-clock { + compatible = "fixed-clock"; + clock-frequency = <11289600>; + #clock-cells = <1>; + }; +}; + +&uart0 { + status = "okay"; +}; + +&uart2 { + status = "okay"; +}; + +&uart4 { + status = "okay"; +}; + +&uart5 { + status = "okay"; +}; + +&uart6 { + status = "okay"; +}; + +&uart7 { + status = "disabled"; +}; + +&uart8 { + status = "disabled"; +}; + +&uart9 { + status = "okay"; +}; + +&spi0 { + status = "okay"; + + spi-flash@0 { + compatible = "jedec,spi-nor"; + spi-max-frequency = <25000000>; + reg = <0>; + }; +}; + +&spi1 { + status = "disabled"; +}; + +&spi2 { + status = "disabled"; +}; + +&gmac0 { + status = "okay"; + phy-handle = <&yt8511h0>; + mdio { + compatible = "snps,dwmac-mdio"; + #address-cells = <1>; + #size-cells = <0>; + + yt8511h0: ethernet-phy@0 { + compatible = "ethernet-phy-ieee802.3-c22"; + reg = <0>; + motorcomm,led0_cfg = <0x40>; //千兆常亮 + motorcomm,led1_cfg = <0x30>; //百兆 十兆常亮 + motorcomm,led2_cfg = <0x2600>; //有数据时闪烁 + }; + }; +}; + +&dc { + status = "ok"; + + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + dc_out_rgb0: endpoint { + remote-endpoint = <&dvo_connector_in>; + }; + }; + }; +}; + +&i2c0 { + status = "ok"; + + touchpad: gt9147@14 { + compatible = "goodix,gt9147"; + reg = <0x14>; + // 2K300 GPIO 支持中断控制 + // GPIO 中断号为 vhwirq-base + pinnum (170 = 128 + 42) + interrupt-parent = <&gpio>; + interrupts = <170 IRQ_TYPE_EDGE_FALLING>; + irq-gpios = <&gpio 42 GPIO_ACTIVE_LOW>; + reset-gpios = <&gpio 55 GPIO_ACTIVE_LOW>; + }; +}; + +&i2c1 { + status = "ok"; +}; + +&i2c2 { + status = "okay"; + + codec: es8388@11{ + compatible = "everest,es8388"; + reg = <0x11>; + AVDD-supply = <&vccio_codec>; + DVDD-supply = <&vccio_codec>; + HPVDD-supply = <&vccio_codec>; + PVDD-supply = <&vccio_codec>; + clocks = <&es8388_clk 0>; + }; +}; + + +&can0 { + status = "okay"; +}; + +&can1 { + status = "okay"; +}; + +&can2 { + status = "okay"; +}; + +&can3 { + status = "okay"; +}; + +&adc { + status = "okay"; +}; + +&rtc0 { + status = "okay"; +}; + +&sdio1 { + pinctrl-0 = <&sdio1_pins>; + pinctrl-names = "default"; + cap-sd-highspeed; + cap-mmc-highspeed; + bus-width = <4>; + cd-gpios = <&gpio 82 GPIO_ACTIVE_LOW>; + status = "okay"; +}; + +&i2s { + status = "okay"; +}; + +&audio { + status = "okay"; +}; + +&sound { + status = "okay"; +}; diff --git a/arch/loongarch/boot/dts/loongson/ls2k300_pai_pihat.dts b/arch/loongarch/boot/dts/loongson/ls2k300_pai_pihat.dts new file mode 100644 index 000000000..554d41b6b --- /dev/null +++ b/arch/loongarch/boot/dts/loongson/ls2k300_pai_pihat.dts @@ -0,0 +1,324 @@ +#include +#include +#include +#include + +#include "loongson2k300.dtsi" +#include "loongson_panel_param.dtsi" + +/ { + model = "LS2K300-PAI"; + + chosen { + stdout-path = "serial0:115200n8"; + bootargs = "earlycon"; + }; + + /* not need memory node, we get memory info from boot params. */ + //memory { + // name = "memory"; + // device_type = "memory"; + // reg = <0 0x00200000 0 0x0ee00000 + // 0 0x90000000 0 0x10000000>; + //}; + + reserved-memory { + #address-cells = <2>; + #size-cells = <2>; + ranges; + + linux,cma { + compatible = "shared-dma-pool"; + reusable; + size = <0 0x02000000>; + linux,cma-default; + }; + }; + + leds { + compatible = "gpio-leds"; + + led1 { + label = "led1"; + gpios = <&gpio 54 GPIO_ACTIVE_LOW>; + linux,default-trigger = "heartbeat"; + default-state = "on"; + }; + }; + + lcd_backlight: backlight { + compatible = "gpio-backlight"; + gpios = <&gpio 43 GPIO_ACTIVE_HIGH>; + default-on; + }; + + panel: dvo-connector@0 { + #address-cells = <1>; + #size-cells = <0>; + compatible = "panel-lvds", "auo,b101ean01"; + backlight = <&lcd_backlight>; + + /* lcd power on control gpio */ + // enable-gpios = <&pioA 3 GPIO_ACTIVE_HIGH>; + // power-supply = <&vdd_lcd>; +#if 0 // 4.3' LCD + width-mm = <223>; + height-mm = <125>; + label = "ATK-MD0430R-800x480"; + data-mapping = "jeida-24"; + + panel-timing { + clock-frequency = <27000000>; + hactive = <800>; + vactive = <480>; + hsync-len = <40>; + hfront-porch = <48>; + hback-porch = <40>; + vfront-porch = <13>; + vback-porch = <32>; + vsync-len = <1>; + de-active = <1>; + hsync-active = <0>; + vsync-active = <0>; + pixelclk-active = <0>; + }; +#else // 7' LCD + width-mm = <223>; + height-mm = <125>; + label = "ATK-MD0700R-1024x600"; + data-mapping = "jeida-24"; + + panel-timing { + clock-frequency = <51200000>; + hactive = <1024>; + vactive = <600>; + hsync-len = <20>; + hfront-porch = <160>; + hback-porch = <140>; + vfront-porch = <12>; + vback-porch = <20>; + vsync-len = <3>; + de-active = <1>; + hsync-active = <0>; + vsync-active = <0>; + pixelclk-active = <0>; + }; +#endif + port@0 { + reg = <0>; + + #address-cells = <1>; + #size-cells = <0>; + + dvo_connector_in: endpoint@0 { + reg = <0>; + remote-endpoint = <&dc_out_rgb0>; + }; + }; + }; + + vccio_codec: 3_3V{ + compatible = "regulator-fixed"; + regulator-name = "VCC_IO"; + regulator-min-microvolt = <3300000>; + regulator-max-microvolt = <3300000>; + regulator-always-on; + }; + + humidity_sensor { + compatible = "dht11-sensor"; + SHT11-gpios = <&gpio 61 GPIO_ACTIVE_HIGH>; + status = "okay"; + }; + + // 虽然这个时钟在从模式下没用,但 es8388 驱动必须指定这个时钟 + es8388_clk: es8388-clock { + compatible = "fixed-clock"; + clock-frequency = <11289600>; + #clock-cells = <1>; + }; + + onewire { + compatible = "w1-gpio"; + gpios = <&gpio 68 GPIO_ACTIVE_HIGH>; + }; +}; + +&uart0 { + status = "okay"; +}; + +&uart2 { + status = "ok"; +}; + +&uart5 { + status = "disabled"; +}; + +&uart6 { + status = "disabled"; +}; + +&uart7 { + status = "disabled"; +}; + +&uart8 { + status = "disabled"; +}; + +&spi0 { + status = "okay"; + + spi-flash@0 { + compatible = "jedec,spi-nor"; + spi-max-frequency = <25000000>; + reg = <0>; + }; +}; + +&spi1 { + status = "okay"; + + spidev0@0 { + compatible = "rohm,dh2228fv"; + reg = <0>; + spi-max-frequency = <25000000>; + }; +}; + +&spi2 { + status = "ok"; + pinctrl-0 = <&spi2_cs_as_gpio>; + pinctrl-names = "default"; + num-chipselects = <2>; + cs-gpios = <&gpio 67 0>, + <&gpio 85 0>; + + mcp3004@0 { + compatible = "mcp3004"; + reg = <0>; + spi-max-frequency = <1500000>; + }; + + spidev1@1 { + compatible = "rohm,dh2228fv"; + reg = <1>; + spi-max-frequency = <25000000>; + }; +}; + +&gmac0 { + status = "okay"; + phy-handle = <&yt8511h0>; + mdio { + compatible = "snps,dwmac-mdio"; + #address-cells = <1>; + #size-cells = <0>; + + yt8511h0: ethernet-phy@0 { + compatible = "ethernet-phy-ieee802.3-c22"; + reg = <0>; + motorcomm,led0_cfg = <0x40>; //千兆常亮 + motorcomm,led1_cfg = <0x30>; //百兆 十兆常亮 + motorcomm,led2_cfg = <0x2600>; //有数据时闪烁 + }; + }; +}; + +&dc { + status = "ok"; + + ports { + #address-cells = <1>; + #size-cells = <0>; + + port@0 { + reg = <0>; + dc_out_rgb0: endpoint { + remote-endpoint = <&dvo_connector_in>; + }; + }; + }; +}; + +&i2c0 { + status = "ok"; + + touchpad: gt9147@14 { + compatible = "goodix,gt9147"; + reg = <0x14>; + // 2K300 GPIO 支持中断控制 + // GPIO 中断号为 vhwirq-base + pinnum (170 = 128 + 42) + interrupt-parent = <&gpio>; + interrupts = <170 IRQ_TYPE_EDGE_FALLING>; + irq-gpios = <&gpio 42 GPIO_ACTIVE_LOW>; + reset-gpios = <&gpio 55 GPIO_ACTIVE_LOW>; + }; +}; + +&i2c1 { + status = "ok"; +}; + +&i2c2 { + status = "okay"; + + codec: es8388@11{ + compatible = "everest,es8388"; + reg = <0x11>; + AVDD-supply = <&vccio_codec>; + DVDD-supply = <&vccio_codec>; + HPVDD-supply = <&vccio_codec>; + PVDD-supply = <&vccio_codec>; + clocks = <&es8388_clk 0>; + }; +}; + + +&can0 { + status = "disabled"; +}; + +&can1 { + status = "disabled"; +}; + +&can2 { + status = "disabled"; +}; + +&can3 { + status = "disabled"; +}; + +&adc { + status = "okay"; +}; + +&rtc0 { + status = "okay"; +}; + +&sdio1 { + pinctrl-0 = <&sdio1_pins>; + pinctrl-names = "default"; + cap-sd-highspeed; + cap-mmc-highspeed; + bus-width = <4>; + cd-gpios = <&gpio 82 GPIO_ACTIVE_LOW>; + status = "okay"; +}; + +&i2s { + status = "okay"; +}; + +&audio { + status = "okay"; +}; + +&sound { + status = "okay"; +}; diff --git a/arch/loongarch/boot/dts/loongson/ls2p500_gbkpjm0_v10.dts b/arch/loongarch/boot/dts/loongson/ls2p500_gbkpjm0_v10.dts index 36428b486..108e5d1e5 100644 --- a/arch/loongarch/boot/dts/loongson/ls2p500_gbkpjm0_v10.dts +++ b/arch/loongarch/boot/dts/loongson/ls2p500_gbkpjm0_v10.dts @@ -5,6 +5,17 @@ / { model = "LS2P500-GBKPJM0"; + + leds { + compatible = "gpio-leds"; + + sysrun { + label = "sysrun"; + gpios = <&pioB 32 GPIO_ACTIVE_LOW>; + linux,default-trigger = "heartbeat"; + default-state = "on"; + }; + }; }; // UART LCD @@ -59,3 +70,7 @@ pinctrl-names = "default"; cd-gpios = <&pioA 14 GPIO_ACTIVE_LOW>; }; + +&prt_pwm15 { + status = "okay"; +}; diff --git a/arch/loongarch/boot/dts/loongson/ls2p500_rsj_mb_v10.dts b/arch/loongarch/boot/dts/loongson/ls2p500_rsj_mb_v10.dts index 8db14a1fd..ae36431b9 100644 --- a/arch/loongarch/boot/dts/loongson/ls2p500_rsj_mb_v10.dts +++ b/arch/loongarch/boot/dts/loongson/ls2p500_rsj_mb_v10.dts @@ -102,6 +102,17 @@ gpios = <&pioC 20 GPIO_ACTIVE_HIGH>; default-on; }; + + leds { + compatible = "gpio-leds"; + + led1 { + label = "led1"; + gpios = <&pioC 19 GPIO_ACTIVE_LOW>; + linux,default-trigger = "heartbeat"; + default-state = "on"; + }; + }; }; // UART LCD diff --git a/arch/loongarch/configs/loongson_2p500_defconfig b/arch/loongarch/configs/loongson_2p500_defconfig index 744fed95e..7abe9a0fb 100644 --- a/arch/loongarch/configs/loongson_2p500_defconfig +++ b/arch/loongarch/configs/loongson_2p500_defconfig @@ -260,10 +260,7 @@ CONFIG_MTD=y CONFIG_MTD_CMDLINE_PARTS=y CONFIG_MTD_BLOCK=y CONFIG_MTD_BLOCK2MTD=y -CONFIG_MTD_RAW_NAND=y -CONFIG_MTD_NAND_ECC_SW_BCH=y -CONFIG_MTD_NAND_LS=y -CONFIG_MTD_SPI_NOR=m +CONFIG_MTD_SPI_NOR=y CONFIG_MTD_UBI=y CONFIG_BLK_DEV_LOOP=y CONFIG_BLK_DEV_CRYPTOLOOP=y @@ -452,6 +449,7 @@ CONFIG_MS518XN_ADC=y CONFIG_MCP4728=y CONFIG_MAX31865=y CONFIG_PWM=y +CONFIG_PWM_LS=y CONFIG_LOONGSON_IOINTC_2K500=y CONFIG_EXT2_FS=y CONFIG_EXT2_FS_XATTR=y diff --git a/drivers/misc/ls2x-lio.c b/drivers/misc/ls2x-lio.c index f007ab49b..242bdf911 100644 --- a/drivers/misc/ls2x-lio.c +++ b/drivers/misc/ls2x-lio.c @@ -149,6 +149,7 @@ static ssize_t lio_read (struct file *file, char __user *buf, size_t size, loff_ { unsigned long res; u8 *kbuf; + u16 val16; void *ptr; int i; struct lio_node* node = (struct lio_node*)(file->private_data); @@ -167,9 +168,18 @@ static ssize_t lio_read (struct file *file, char __user *buf, size_t size, loff_ } ptr = node->base + *offset; - for (i = 0; i < size; i++) { - kbuf[i] = ioread8(ptr + i); + if (node->parent->lio_io_width == 0) { + for (i = 0; i < size; i++) { + kbuf[i] = ioread8(ptr + i); + } + } else { + for (i = 0; i < size; i += 2) { + val16 = ioread16(ptr + i); + kbuf[i+1] = val16 >> 8; + kbuf[i] = val16 & 0xff; + } } + // pr_info("lio kernel read: 0x%x\n", kbuf[0]); res = copy_to_user(buf, kbuf, size); if (res != 0) { diff --git a/drivers/net/can/ls_canfd/lscanfd.ko b/drivers/net/can/ls_canfd/lscanfd.ko index caa563423a6ddda9edd0cde8804b1ecd77242512..580daeb4976918660bb77d37172992714fa891c9 100644 GIT binary patch delta 20118 zcmZ{M4_KYmnJ3>hrbLNCO$wh<2Woapr_n&bg5roR)&2e6_uS;< z?p&TH-?{Jkz5m~H&Ue1^-J9XZ&KrL0yzZ(Emn{!}`H|ZmzI4r=Yc3sp>!r`!I<)oT zqxD7M#+*oOZQ91P*COMQHRo(h`{2>HzRZ zIwB8T9)BhL_&Lu94UcDBycnGO!A0+XZcRM@!h#R2J{|esn;(2GUYh&a;8*c)zxYsA{Piyg^tWwJi>dzjn_S`3qZuvd0I%@WJ`P=J?=Ovcp!#Y659#*RJKK zbJ9BFQ(wsrD&wzz<*FbvUR0kQPUj|gto^#<%#7CoJ@wJE(Z6(PYrLm^OVAP@2Tv@C zXVCGq#Fy%`Bg?t*^Y&d49Eje|6uMaO`7eE1hxzvG~z_*mMBKJ9I9r0$M(fqSz*E=*bJ_z(c5*j*m zEIxI8b}$=%{rWB8(4}W{?+WDBmTv&ZV3-0>G`?iDToh#bxUv{K80&rJh%}9CCQ(q z)0{;>XOqxBI`m|`4(PF@NY|y)vvbm_;yplX{=?aRZgglye4Lt-qR4mXXnYB1W|HR1 z9U6=0-*i>jx%q6(|Jk9#@%Edt!@PpC(Q1btiyyry8?irs(^W+)Ng8f(JOx*rEqj~m zuZ)*BW(TqO7aO+(1M&MCw}itp^foi|5agOQtVGUv@~9~ zKRatQsdmrD=Nhx)1N+m%vLvm)baDfakMD2Excka0)2^u8x;@J4mD~064qSH@v43Y# z343-F@fv0S)*V~*TC6?f-&sW2q6mBRvem9pGVUx=p(t5)7ODE^HvPF7Aioy#f8>GPl`+QT1Z93McS{v6|0}cYNmLr$*KYUymbdn7MEDRdb^de6cvLz87D~o{}r=v-WRiWX0PlRkBT0Z`S~}8>%jDC;!f3q9xnZ zTQ~#Z7OSS znbV5y+^SZ#QfG;BmMG`lCEL_%O;pJ?W1@$ti<*@3U#X5>prfi-2S~~Gt&cy`y6xq#(%thmU_Oj`bD~nR zt_^V0ll)q3%8jZvs@bS^P*QMhkRiF(2Dvg;8>9zSGDWaT<_Hd48x%<19`x@Ps$fTk z)Yb+W=%5yMq)TUQka_4!U>ydl#J&{d$@HEeGlz_^IHGmof7$rmDfL z-o;ceDD|!ires5H!n=C)P8PoeGxIPiv+!94YGF{lY%nhqy=%8h0Nfz~y9 zpj92N+2b4zTb!pKfs;Qu<7iro1bY!ko0sh;J-AJZ00(UrPn*TlX7RLHJZ&0J&|#b% za+HUFXG0quF$Bd<8M$-|@8a69gdmuM!TF^-?v!-R% zw45@|Q!+@-Q-+H#+IB)+{#=jC|XR*ZoePUT-lEQk7?Wg6_^}#1) z0%GABw^!ug{j?Y48d<7`wKY<71I)zgVWwao#{3$oJKa%(jxarif^=!$2L{7d}h$`r7$ z)G6Y!vMqt3EtP=ImRjtk>JX@Wx>su2OQo7rnQ@j`kYyHRnFbl`GHjQHwac{ZGA+AI z%P!MWVVo7_e}!Qc=KuWl$jCwiE;%<~5?m9=1vdl_vi+MIg1v0tcl3h|!JkXvjV|1A zFP?f?x)I?vx^S6|5)W>a{F{)e=^HU7o{`sX3@!^>yv#i7v9?G%Sc4YJOpC?TVllOt z-z^qXt8t=Xo?0z4t(FCxU@02_|QJA1zoCAGSM%a_aUqLP)383D_o{igJS z{oq(6N3UvSzbci&{a8?SMD}?j@-yD-=`+9k%f+Ny=3o>)W5_`lFd&CkuY}l|RcGwa-Y>6EjmRnFb_cy zTTl;ib1J_LQ#02+Xmd^6?#;JcX$B0g_B*s0H0r2PQxwfhA(|(_?U2cntQKvGK!ux9 zFmIANGH)_Fn?&tw61B5Q)J{PP(E?ebXn`>oNIra%vfD6l9+0cypw!-hbl0FmT5rS3 zq2xTtjN5|>BP(tP*?4;bohG?TwDeAVYJdXX>-XM)g%9nUcVOW|drgbcue1bz9@abe zxVRnnGFUI=e}TZ8Joq^eZjxreQt%f+#`^#5^&gNyinVxRKlR`igIgWU**xLFtrD~% zC#_aJtbwdot7R2ypi#^!mOJG{!z8v@v9KbN>M#teo>8g=iy!5%wW1bmtw?nmXQ!2- z)38n}MRzL(_xxR$%|oro<38LtTCt+F-KJ|EbqZKAguIVZX~52l_s5ndmpy`_1)!bA9Y? zcQbq5%PrPFR%SLuWoE51iPJ4s=4YNXHc@Rz7-np144NMZ7lbKWX5 zZC!&Ej(wO~e5ZoxuWFfEJ5xoF`n8n$TR&9*UxcOr!=Z8pN+Y)e#T#Zm|s zSD6*7jLK+b%Gyoln)XCxR@FxV;3_leSY9DZ>|RtRO$IwqJOa{xPmpow9u#Kc9&P~L z2^S0F-@?|&+`WiujRf~-lSTPF=+aHq|M60rA?3u{fSt>uK;&Dm{Xz1Tj{!`$cH)K_?M^Gw6t!i`}g3)Nn^M4_;Au8 zUmCWkgnON~gz^tAH0`~z{6V0jj5kSYvky+(3D6ssS=q3B~1@t&JI0*HEvhF zNir>0cqQ2-Q{Z2hfb*peq@+KH$LU1h$E+`kzOW*N8a%i?i2Nkrq{IKT3h5zSnL@f! z#(mgvoes590v}F#laf{`MTDzTD6f)gq~bK3EL|n-%v9UA+{*J$r_H9N#Wbhk5vQ32 z_-7A3qDc-=`XN3P_2Q1T@(?avxZpIEhLr7498+r4I+-f%lzHSx z2IAmX$r^sj#RbQyjE7LVRK&ql*o#k#RHB^owFfm)#{$)u z|25`+jrm`7km?UXeZxVhDwjP6gG;3QA@sH#3>wk#uk6T!7eRx0G^--;C~WjHRUVwF zW}_t;4U^nxNp3W|jh5u56rxS$WRo#BsguEkG!*N6MuD;@_PFR5U`Dd7CM+H-qBvi=%o7HlXknD^L$(l+*^jAg+_{-SZB;T&1C zk+-NLFIYBg*>Zq}a?7S=*|aR1mKEb%v5;2`ThWjYeH#T>`8Kzb?q#fh?#PgGB>!Q= zlH*{`r&;#9KkW7ZW2P2;Tbp*H>Wn%{(cBcG*#40j$9l{LwtxL#&P&0ZC*^>VakY~t zY9~+BPM)ZpO({h2C`?g2Ez>D%8Xv(R&g@6v1^*q@n|K(5xbzWR^iwU!V6&Prrpbpf z6S}OI8mxEZVTd;MCqxVQX@N|I8V(^GgZJY^>JfYx>xT}tF+#>lTyUdfC}&`rkokTN zD(J>KRs=uMsPj>CK5EYA{SB2r%A2E$Ik{?;QvN8iS?Q(ZQ;CwHt+cA){=<}1S~e@q zMx|x5Durm3RSoZAShXsxnq)qTdk}|)Zv?MpnD^Z-mtc`jMz&k+sEmdh)}%01W3gjd zp_f=zSh%uBk-JyrYJ?}XgGgBoI;8bc9z&3vCz&z8Lkf}=1GqE}B+zM+t3*q`i%$(; ziR{K9#UKtP(7ri{LkhIle8=clzJt@*yu!`EMt=t(xE<2&vh8$6P}kI#$t=jCmjV7?j#(*z2><}spo~?Pe@gK zA5x2y>NC#)InT#VGfk7J3d29Z=8>uuQhyh}pYV6UM)!dEJ7E3}n7>U!?p9YG$fZNL z)s_AL4ipUG!h}oB5SDuF8)2Vja#;O2^aJM(&PI!VfP5UYAqWbNfYMb1=cYz+)d)t6 zbHqFuF>FLV2~JAZW0*xJQ%tfMn`AR7hA&@f_4*W_wMFSS2p z&e0*Qk8v82oF|!agp-V9#SvT@k0j7(lB+~*l7U4h*$>?$`=Og;KXQ}oN1SBCZWsF- zZ<)eI^C+CcQaGYbGpMl4ZP9sK_LsdfGJg)s>cOMI76kI#(cqI=y!HN9@75cWy8j7P zX#Q54<{xR(W7MEgEvg-lkVdHny!HSU_NEZU6C;^>MV;F`8lOm@(0Ni_8~YwhUsA#iT4-23JxruUH0G%+8A0!8VJcD`sakh3Kkf5D&y;UeyeS zrS98P9O18fBcfEAe}V~F^Ak+YH)P*W@XBwu$NF236leJPT9ppFoCK2?^OD#l zMSl+$aOlLjhC7H+<3{xuwL}VMA*8w`|9@$-WK=aN+)YUJO1n|2rB_r-uc#IbPHO2h z&OXUPOdNKU>yvUuIQI8k$Dc&y2h{1{xRgH$__$I<%U%e7=7o^x=Qud4-(p&}n3m0( zWwVGv!<%r$sZ17Ku^?AOgG8YbR=ApidDWs`H9MIoHPf<@6Lc}9nwy?+k+Q981DxNPk8W>2jgWQ;G#tbb71_L2PgW~Wxrnr zQIjwM=X(%8F3OY-Cr5;5nWrGV?2INWUzQ>tcC+WS36zrXN(yOAK_58tb9DbX zsJc!bcn%Npg$N4ILaG)V*t${U@N-UMSmKT`S@`R`Ib0$~pMmZYb)AQSpu%Vh=BQ-R z9~`sOpQuz*6h}KowNtb-g=ndTf+dyAr4~xzPu(Wu?b9PI4JUw0KjoT~z?MC%Qn9eg z8R5Kq$Aha3u5mDD*1vghjkHg|c#Y)K?;4Au#-gY($G}3Y);Mb|IklFYT1^hWjYcgo z%SFtz#7s-fw19W#DBLa#Th-a^lOJ~0Rjo=2f{eBcvKgILH$)hb}JLZX9tV+Zz| z99m7Mr8+4!MyVzne}HWK9r{^9a}Gy)9!6tuKs76(Bc$+WZiHYzpkuDZylpXWTh!aI z&rA5bUPk*Y;U~R>f6*IUCuQ&i@^I1;e$rBf;~XaEq!~DAshT#^$ZX^2=SZ2wB`AoG0RIN0=R(e5=;w9uTXq8h4`$6g`*ZagfH(RknmIrW_;&_apH?8WX5;O z=r%fyVw_S4hqID>#5YhF=e%+%i&VVA<>zHLrq1yShfOa>#j5jxW6FPkTQzvIn|7?L z{{V;8nx-~O)|@uMue2#Qs>rBjQiaA@D1%1z5JM*^Y`mzYM1ohXAyy))r9@OqiKv#S zaYm(woEY%rjLJADiTw)28<|Bl%A^_kq-qu&^XQOz^U*n6 z+Geq+w#=b)l`d3fb*Go8O7px@)bmR9T!vvn^Y3$3SsZ9+gDg@3%~;9lu63xX-6>3A z#b$WBExg?p-X#3C@M>iVaMK1ye_>L7c;Yd}h+pqC}(z@WBmAUV?x(pcSfaM6&oEQ#TS>3~i9k#5XA$Hib95yY7 zP0NsR4q5m^hGBj)8JKvlX~Wntw#P}$TcNvOLuyuDL-7{8jQZ0SZ@=iuf|W%1wImB_ zL$pInvY0{vPH?CI=Q;Eq&zYdYO7r9L*``*6%);k$iE*>E%w_;9_ zMJ8Uw@SXjQo4EK|)|o#E=E0mHb#H1@L@LLq93d6vx^GsnuIoI}T)Onb+GN-!$s*?_Q7xN9wP24(Et^EO6c{JAedH`KtU#tf zN!#m)vgHj#+4nj|zJg&Z=iShb-bfJPd@qvI>wL!K5W6hWD=bJ4a!~W0_0ph z&kL~Bd@41cO3kNIvx}!M*bU24h?bd?WyV})PBy&(*S5=DNSAaiAm^RvkRxwk3!`Mt zZ$Xy+7CSyATS)f*Hi4#7V)FvFk4^sy&l}#vT2O1%!}%?%*P!*nmTR08UJNsNxRsH@ zY*<2rJKFEG(W)PlYEs8ki{$+dYCC_2gd~2;$AtJti`XTx)T5dZIq8Exv*=8v$clfnZEH0;CFdbrAcU*!!@`$ITR3L``99L{r+KrY2IDny?B?SOq4m z0+Wkw3S8)w`J|>M%yZu>;xNzj;5->;=5S>2wl+&f1o21UDc48Rc zqzVi}W0Yzs5Yt5*`F?brwG;ri%1&=}=qhBonZLOW!WvUhmM zg9xPI9cK*pu%k={o=BLX-J+Sr{f$(OVKtW78r8%%u7+v$YAmxjgP@jL^RU)D#Q6j} zo22Jm%;zQ-mH&1I0j3?0al!|@p#PIMMh@8EIAF#PnDGN<;D8zrTT+O&SWGPzQ;WtF zwx(ciwIEx~POI6$vknJZtJ;z7cin9A{cE$3aZhK#$s(Qapx~MBxw>TGmu)Mk%glSo z`^1W?i>$2RxJ3JE2sCnBb*rZ`08t$^I5D4k5B70X&XnVfoRgr}eCsvedaVF`#@T1y z^cmJ?LnQWl=o|S1oNDBiRQhz+dWmxZr%m3%yi>D%GG4 z#v=H>KoH5q%0-8it^pmErI5w~#c1#bmXVfeq~Wd<%)2b~U6#OI7CJf^I(}LQMF+bh zb}#ci#P95whYE8E95NJ%VDd#G_PZ?nMB=F+g2@+&VDbf#jDxHAuo6Tt_t;g#OBeci z&(%$}Hp507(z$Q%K@)fHj%7a?WcxCAQAh#J7QO1(FkA6{NRh zv3ZLA(;ZAexR}BeUWId{FPdL?km6#}jexNWdIZr~qKBA)6YC-^Mn=yAS$kfj!pJ_7 zqvruVay~v4@KSkxq*U_O!=KLesBUyUG+r*3uaDqq0ll~%O`Q+z;6Md=salU(ygDcYIUOqQS`2}!wgVbec(+n!iNx_^WgJjN8Gic`4D~0o0c4kpDH-%`fl*2VF z$jY26&2+Ts0%V`JhqazZ*o0mPY!aBPY($uy7a)=o7viFyMj6=11z2#jFNZ)SSg;vo z3=+E#f-Q&{XD#E0SsA648s8oogAWpBU!ji<5T3* zY4XB_kq6oC&5Z12`&6dU*JMSml?k|vabcfPrz-|p+iGZ0S#etL!>~e zP|yHh_hEGCaE`||0vaaNU~16e25|L}+#k{oFH9(+WCoXBPCKjw9fN?i`rXGm~~Ha(!iye$yKALTFenDMYhxWd8Q z$6V{d6|&^RoOt}p(<|S1=7*ki0#58ODx}(n-Gif(uT?5-`q0piHJOMsZ`B zQ2y+b*>4kO|Ij5E4yCx@Zp3us_^pm;zoPuEHYprZ0sHaTC6U=G&iBU1)0l&G`y)?F zY(K_M!Of8oY=Y-*M*px3-h%$wo6+CU6d93N6FHhABaxL{d9^w66zV_tHE?F)x5;Qq zCI0}LGMQt8-wWJE@dFgU9pVGGQTz@Vn3cIZz;Q|jThQQ`>P|G7lKZu|lh z4Zi=_ie^;u??N*sb8PU!^Xq74rS5Jt8zjFCO`go5k-Rn-8ES_StaA6DA1{>dW&geC zpT8IVUHF9^`l0zgG-Hzg4K&APjtyS3eiIFDw4K`I-;V~~vPs8}gwVj-zluB^S>7Ta z>p}+7emvI|`P&G76WQ~v$Q`J~y6(u`cvEvfn`v3sgQiUG@4-)vTjY5*m&m$@&@9Mj kA5!djQuDGd9{EgU=$iOo(MKc}j}!z$KfXU6`FQ020lYY>(EtDd delta 20230 zcmZ{M4^*7hnfJUCsuN2LC=uR@yF<-xahI5xfC*{o3Y+Y4dJg)*XTEl7Cpv6VM!MDi;4=$_OQE27Hs@JRJ2gB#TNDZJxyJnid_`aZMhtmnIrH-2<=R=j9q@y6Asy&oU^_-c=*avlE{FDd+z z^Gf{A!UN8YN8c@c?d;rxZ+?YfueHPz6?+GdzPkB$m&9jFbB?}s)$hGW|Et#hloN=5 z@a6w;$+Xuae}~a}J?lK97b@Lp`hRHpC*w_D+3M6B?fc5dpN44P*Yn+W!>R%v&oyW9 z-8xTaeCq4@PEGvHuV3N#AtaCPVuk##=HvtV5t(DziP=CA+XnPv!8gw!~ zbwj?h7=QDIt?uxjtkn=SJoEA3jrq<({7W}(b$a4=-FSsF6CcBUSA6M4Xx_Y5YM+tn zjTgo8-SNL%i{53>m3S>s-(Rdn?=$GJcpK0?X=t}W{qZ57d1;y-HfSi<86r!ii2Q@(R3{?(hdy6tItUNSu8@xGh3I_>c(T)X1V%@`3AK`5oq}FWbS_@&K;8g519=SjIg&x5<_Jx9u#I ztMr$b<9=6=uR$;O%VnEh%eiA$P!yN*byrZ;^L1BnJFcZ=rT3!Qwv)R`%UEY=ASm~2 zy)>Xb$|~0YD=HPQO2xxcRkV$LE8V8DVnBMf?PT9d%d}s-Ri09bZre7`z3^q5m?`5R zcWq;@O9LWynJB%C(X#D&Fa0}&M-o@IT~zOo0Cp%UE@~1>S*mP1YcAa>A?@Tac9n_- z4*OmJk{t18OxS!7uDM(L)*m_bxWNVbk{bGUin48 zaNb+CUA&e=m2DSSwyBR|Mp9iSX)oI$(d^)eca=)q<;=6IRN^ZaC(1?j4vkpQZCVaR zl~baZ!B%?iPKi)H!f#LEWNn(9@pG|V`wa~sXZARmjy=bcYhjz;ypQOrAy;=9{wm@fd|&pzSxw32fz zLi1k-hw|u>>yYe{>r7l!bDh(nzILjwNw8@$8>5J&;#ypa`L2*d3rC#>?HlI4LG(F? z#ETE`wSNo4^Hjw4=hYi@Dka{` zi#HUgM@Zqnb#j~q8e(`sLzR9G)mcOv?1(naa!SM<9v=wnSE!_-@c{Em!B<7iYB@eVOT7l=$5@2uz zZZhg~ zAnI3UKlOofOAIq-WYmhfgr)$~Y|P2_Zuii;G3Nrxz7hFbK@Sz)tFVa0j(vd}2|MLDr$(cc}Lr>QIMxPow*g@lJR}&2o1=)}2mC4Mky? zhOftRQ*$fsa&E=qES$bu!M?zpU832-OSG4Vm-dEPKFI{Quk+I?$=WHtDSze)30{= zHCY|EA?C~J?%S}^w_@(oW3(=Gcy@PXVmQ(b$doreIf(%360}~+BuZ z71gq;oU1y|K{2*!=J^3sp!yCj1MZw1wD*AX9W?J8aIQmhWwTHxo1N>t4|?dY?!syr zVUf^XxHQ~_^-#zeCRgvmYAIy-H$X?Tvg`FB&r-s(4-eQA?(5Uhrlq0(ZmzBHu?oL@CId3!z!&H7J zmcq$jU%upb*evoviqp*TZqL+eeKe; zK_{pwrG`Mc*+yl$Xg1~E59VwN-X~2JDC%g(mhN(g?rC>ELs5=1(e5;G&$;)ZXAwQv z#D%4Je+Nn@Gl^H}UX^urJmAR5~xiTTc%+t(%qX}u@4q5O^R^bj&cL$_% z?p1go13aMcu?+Arg~u)U6-)WJ!qXN!X~EOf_5fU~G3VhN*pvm=&=6o+c>s@@SFQd| znq#qEOYAiZ?xoys1MatATe@Ggx)T;WZAnjva(d-ruTGJFvoH@$vF6Qw?PGs!c(cO$ zE%;Z;DcAkv{5_--2Id7LxMuYa+AvRk{`1S#<4I86e+Q=yeiPJf!)Yg`9y}2k?l;;} z%0J$y+WTqAhCgR)rkVkj9!QhUHaMOqES(OgT*DBu;dIvqRrz3=@-m}*P^D9FvFT1V z*;Mr)W=b{$Aj9Dd%EMG=!)ZUKc*4}pa3q6tgvM+*-L;6imXc0)4e#MB9nGLTO0~$& z88}@UZ{!R&8fhN&|9&PZ9#5kr+a0ms|FGZ@Nxgg8g8$QkPpfq5=QN%aJ1y8xRb40? zo;nXn)1=gpQhiFzfg=Ay{AlSyu{Tq09L$@^=|0mRM}M*EDyAle(Xezei7q^Llww^@ ziE@^Zb4Vz`N+`%w85J>08O`;e2~jO5H)L|gBkF|Zen|ZesjZOO3aPCSiQmnK@ccgE zp<55(Y3+~WXVH98r&PWX##Yp$~^1RnDlUIjY`9)!W1o zOvMJcOkuujiR0371ZStxH_v_9Kyg6K8Yw{Vjoota>Tm>!+;1ha%JOc%y0u^3+OKZy zSGV?yTW)g((Ps6tS^aDlKi!rL%q==N&~U&lYNti*w5Xld45B!0<^;AXbE}LN>ghq= z!#&9RX(Ptd=j118_nf9$3?v%wL2634n)5Wo9bNxu_GqUpX1w+Sb61TnuHltdmR2eE zyKn)UTCUTo27%42Qc}ZJ4Z>r7Waa^DYw*zA_aN$_rH7@-?d6fiuB3BjQ57(3;Of9B zEY$Hm6f%pt&vXoz zKqEv4&fgFr`M<9^Fa17bW+6kZ-$&Vf4->tq$2m6KvN(_fI*&$7KNRmxm38*Xh zfs?a-Pb%MZNgqyhs(*l3V||GA^R%}QXCa@bclvNL@_D-QheDnFAx=hKM;0I9lMygd z=n-5R9^tbOCTEyjeS}X&m@MzdCDNZl$C+H{$H_T&B&V7QvCm-F2MkEuiAGx>kQ z73sy8${E1j-Ye@PKAG^eA*!@bti4j^vo4kMi$j+&9C0 zJSm){`Z)S1BICK?j##O*7yA(kJ_=(a>eh(5HKJ~fs9PiI7LHn(b5z|LRkudPE$6sm z$91M0S1rd?%W>6mT(yiV=eW)hyt8nq<7SQwaz%cMIda-~yM-=!?93c_Oy|gBI!7MU zIr7gsNB$XefV*&kORJerh@fzq6_PU!-Y+CQxHa4S{lVjLLM;99n`qs8i8VZJ0SP19KkL zvgSOslSg6)Kc}%BY`j^tAcJTD&9Nwc8e`@H${hl;-!Suo@&Dq#)SsXFhMcRNE%g47 zvz01_5li4-%#VF#DJHboc|Z--95v6&c?-jjJZz%TnBY|YFKc;eq&jv4KPPkM8a1Lu zji^zb#O{_|-mjedHBtLDQD_)zR;*d`(yUsVRZFvKX;v**$Jib=5-iuE7=A{2!nv5L zk0HR=6Ighj_0Y9XIRC)yyH7aRa(mU2N}qbt`JZmmipD;1N>c3;P@B|fFx%KxQvFD( zt)%!tfnf~l@Dq4E9Mgb~NkH0PoJ2o<^k7|R*wbOvHLSXZRoAe_gjvd*BN`Ka7h$U- zQd*vZ!=Nw)QH7xA&$KdJg>6<9QvEzC*Ys20Q;_yh-M>mRrBt_4&d*WUETb}AG>d|O zv3M>qa~9Pxvo8ZPb|B2`Q#;s}upM-=D7GcQg4r2F?S2j}H7+p;A-z5Y7t>uob1vNQ zCbO8oYMT0)bMc0^QZ!oZxqk*X>y0g*4{uvAzPVty!GaeoxIy7w19Ot2R+4)u$no@Q zPJ1<0e2&1e;s{7Fj+JtrLe%B|ib0UjEG8t2+8_Hl`tjIcemo&KZ+L7dCA!e56zk&0 z1}JyHN*}wNO4EQapMlfg?UR(t?qNV9aA%sTn3@*qOId%ev2&bXu;NVh^N7gQ&ys$= z;1Ao_QFv&Jad+zMB8!>;pRtyHcHuK#q+7H5SzYR!1%r##rQq~)mh24b?0#04I(Wh1 z2Rok*r<~6g=YuIY-T9mh*6i(fAo zp0VI13&ziqfT`vg$M-3zBz-sr(_fH=N}j(`6+A9Ytx|PLwXw>A<5+lq>!EXxW5+iNckn11V?2-M z81FLp_Zjy;3%o$I2|$r&unj06R>&RrTI(5DTQo8su}l&&RP!7*U^CBR3T>vk7oZ(y z6l`R(I=ERK+)UyiSQKLi@%kd1c#BbLjIm;I4sS4m;SB~E0VQFUsFo7dQbH1D(eLigAi7)K-mN*s zX&i!ZLm8Mu8VBB7*bYuuIO34n!GQ{kR%Z~cran$VwK8Lk1?7efGY{SOtYLxQG=GVL z=Nd0%oO!%_Da9H=vClZ(kg?XP1#Q)Ww(2-+SFBy@ z*RERHRZF`@-mY3Yl(R$2)uC92mTSN&*YB;o;-v#6aZg)m|Ee`QPgCCn{5!27oL1vF zTw$kAtAW#Md|o+m&cfKdhA^)oEGV|1AuOnt1=X^kS{76be!ygVXn4deDz+#g9GT=L z;AOlsl$b}_U(k0a@y;;vGAb}LiQ-kzOOtp@sGz-5cxR}fr>2Cu@>S<*cefGZf%Sov z0L-3An8NINS(+uKa$gauXiAzYP)A;anF*Mo;a72Kc?AYBalk-{SK->gD;QT@ui>ud zHH<6a46)1!=By@GY~h94%LcSJ#PW-0j12Hy1Do?rV_fx2Vtor!->W?JOenk}+gsJJ z#(){fF@#BCz*hwv1HNEI3~nTYD0WF4a75xk)5pxw49roQVrI-(wu2K(rNj>28(6eH zgJ?a~u}r->RZrba;iceL(hN;QwAF}mq5fzU3ey2Friv7*RgL2~f{nMTzE&|#qrXBC z=BJUcb`1;jgVQYiTqb-YCb}>;SQ=l9u^Sz#t3!2lh%S5rA)KA+cc)^V>h~e>+dX6) zPWv|uo(ZkiM21x0Covvz6KZ@yjZdh73C-eU2GL0kYf`H0d`&14Xr(WqyXc}AjkXALti{Hs=dX36e@}t z>wwX)G!BrNc{ho!-6Xmy=lCIT3YV2xTzX%}B|L{Uef)K-_<`49X?PX~cQqNJ!Lp8E z-LQeV=DVyMVV!52Vf6s(yi(#pSUhke8AP$pGjl{@Lo)@+jb>oRPf{Ey8jcj}Jc~v( z(x}?0&mf9*o<-}Gxt_+DYLFVDSpr3|U*mIxEGw)oD*83N=`kvKWPHkkdjzJ+(`Lq> zWnl>w9W!3*D5Z|syei)4y~$D{C33^_Lz6p^wq;d!M7pmq1rd4sRQL^Wnj*tZf4G+ zv3Y5x-jZfXDThUU8AN?lv;bxw3A2xCLAg1GnG5Z+s+B_yt1P6tcclq}qMWxN9eWpP zD<Vb18{WEV#KkL#C-`nVjs=BDw3Hv`^?!6mj+9QcH$VM5b@-4pvZ zA!%?YtpR6?PHJ8zH7}Er7k4@X^R#AZTJ2!>#8$C;Vms4nXC{LvHcFhL8D*Z)fqmLA z^T6I{4b9V%7dK$$H;>#L3l7j2(uQF<^`10KN;%6y75!G4AgCkD7-JJlJS5-4r2!f5n#~)zKgt%i|>6r z!#dta0e4d$oOE}aP`GmTr-67>atyo06dH+PH%Sb5R3Zj9ltB~+6dW+#vpC=obu)8y z2IguSW9DkLQ>}KY)lRk8p>a5lA6%b$AMcIP_mPvF-PQ2qNB|hWX$5c$Qn7SBKEiu)CLk-q~Lk;G{bCK;eP^~tC zHBcKUN_@Zt{XJ5S_n!~J)lOr-M@HJMjQq9bd%HS~e>lTVx2w5!HP^10@5msE;{*1l zLo?qYQPBJcNZ()6$q$geNernYe{dQ=@B4#ECw{19cPaV@_{l@V?X|L+Yk7u4@(-XM z4QCbq+=U(NRR??3K^(5b1Ik&&SUUm3H2z0iWPB%dd?)|N>EQ91SjAm*72{ht!z?qw zBN^Y|@%a7(m+{@NZb~nY?;{_kYz(uc4DW&uQ^OnEfIlM1Nh?$K2jYlA7dW8AOk1l8nn`I*iCSEk2l8+ zrMfKt`L_D-m=`OQL3t&-z)C>1gjTJgVP#?mtJP#RacFK$2FV(YwT2|t8i|$Wz20p6 z41Utp-`9z5MT%IUI_vLsAC3aJ$~9=hWL{xSpms{Ce>Z>li1y zUj3_A|LVm*EKLWU^Z^6)^SrvJQML6A5>GR^B_i>(ktUTL~ z!X8>W3*q*Nw>|1DUS&9YJ?d?b<{2v@Gxlnpd)3um&2vJrgytDP262>l>0vGCRElHf z)sMCGYm)mF>zBbzf%ORNgb$a{dT#-~_HfpNbyTxGPC=%|g`(MW5L|3Mim{-xyW`Uk z>tzMQxN|O|$3E@-4w^4!d#^+DaJEoeHh8agv&{d%f=8U42`nQUU?Gc!v{~9H)SOba z+T@;#PP{HK<)bR4+H!u1)#PyI;UQJ#nosBLH{CMoM%pNmi(pna;WEs36C9h| zoyhezD;YWueGTV%LrM-XIdNVJEk7S*Sl=Y_YK^=xPw{*5fOF{h&X$u(4A25fgAP{69r#A*T!cPp zWKOXRXNLltOyMZH3FP=DlrXHh80C%??!bEvkEw_{jo+TwjKK371Qs*WA!ceW;GA&o z{1?EgIFC0Wl#LcyX*2sWdjake7r?wYU$0tIy;&Lo)=G{*dPQ|*eoA#tKG%|C28&wY6s?AMIrvtFi}6>HWh z(yUsVwRX*_rCGJ$(;2paAF8yGy5hGiP;RRk61*GmTk9^~^$NTfZz!_5@G%)nOjr`1 zwcrV=D}a?kaxRpn8X;f7j9&S3ukXC{4WK9R-GW#05Pm}*v4Byy3?=WU=(XHr+ zHlkzxR&RIH z!{k4JyMa3(hp*%B1P8Vx2hiYXey}gn}BBzGJFs)9?%ETkB@!Y z(LnQkXeO!XTWF?fjvM?4dOsSR(sxKx^Z*)o%S{3GeH#tD{d;5}D?p#^L