From b212174b4f911651ab6b5785e6e93187f7e42f10 Mon Sep 17 00:00:00 2001 From: tao89959 <1036524114@qq.com> Date: Fri, 2 Aug 2024 14:09:54 +0800 Subject: [PATCH] Add lscanfd.ko (6965e5fa1627) lscanfd.ko is in driver/net/can/ls_can. usage: insmod lscanfd.ko insmod lscanfd_platform.ko --- .../boot/dts/loongson/loongson2k300.dtsi | 40 +++++-- .../boot/dts/loongson/loongson2p500.dtsi | 8 +- .../dts/loongson/loongson_panel_param.dtsi | 23 ++++ .../boot/dts/loongson/ls2k300_mini_dp.dts | 8 +- .../boot/dts/loongson/ls2k300_pai.dts | 26 +++- .../configs/loongson_2k300_defconfig | 1 + .../configs/loongson_2k500_defconfig | 1 + .../configs/loongson_2k500_mini_defconfig | 1 + .../configs/loongson_2p500_defconfig | 1 + buildenv.sh | 49 ++++++++ drivers/i2c/busses/i2c-lsfs.c | 10 +- drivers/misc/ls2x-lio.c | 2 +- drivers/net/can/ls_canfd/lscanfd.ko | Bin 0 -> 169392 bytes drivers/net/can/ls_canfd/lscanfd_platform.ko | Bin 0 -> 27720 bytes drivers/spi/spi-ls-io.c | 111 ++++++++++++++++-- drivers/staging/rtl8188fu/include/rtw_debug.h | 10 +- .../staging/rtl8188fu/os_dep/linux/usb_intf.c | 4 + scripts/mkcompile_h | 6 + 18 files changed, 264 insertions(+), 37 deletions(-) create mode 100755 buildenv.sh create mode 100644 drivers/net/can/ls_canfd/lscanfd.ko create mode 100644 drivers/net/can/ls_canfd/lscanfd_platform.ko diff --git a/arch/loongarch/boot/dts/loongson/loongson2k300.dtsi b/arch/loongarch/boot/dts/loongson/loongson2k300.dtsi index 5bfc39935..a413d1db0 100644 --- a/arch/loongarch/boot/dts/loongson/loongson2k300.dtsi +++ b/arch/loongarch/boot/dts/loongson/loongson2k300.dtsi @@ -25,6 +25,8 @@ spi1 = &spi1; spi2 = &spi2; spi3 = &spi3; + ethernet0 = &gmac0; + ethernet1 = &gmac1; }; cpus { @@ -123,6 +125,10 @@ pinctrl-single,bits = <0x10 0x000000a0 0xf00000f0>; }; + gmac1_pins: pinmux_G44_G55_as_gmac1 { + pinctrl-single,bits = <0x8 0x55000000 0xff000000 + 0xc 0x00005555 0x0000ffff>; + }; i2c0_pins: pinmux_G48_G49_as_i2c0 { pinctrl-single,bits = <0xc 0x0000000f 0x0000000f>; }; @@ -151,6 +157,10 @@ pinctrl-single,bits = <0x10 0x000000ff 0x000000ff>; }; + spi2_cs_as_gpio: pinmux_G64_G66_as_spi2 { + pinctrl-single,bits = <0x10 0x0000003f 0x000000ff>; + }; + can0_pins: pinmux_G68_G69_as_can0 { pinctrl-single,bits = <0x10 0x00000f00 0x00000f00>; }; @@ -436,8 +446,8 @@ interrupt-names = "macirq"; dma-mask = <0xffffffff 0xffffffff>; phy-mode = "rgmii"; - // pinctrl-0 = <&gmac1_pins>; - // pinctrl-names = "default"; + pinctrl-0 = <&gmac1_pins>; + pinctrl-names = "default"; snps,pbl = <32>; status = "disabled"; }; @@ -483,46 +493,58 @@ }; can0: can@0x16110000 { - compatible = "ls,lscanfd"; + compatible = "loongson,ls-canfd"; reg = <0 0x16110000 0 0x400>; ls,clock-frequency = <200000000>; + ls,canfd-dmarx; interrupt-parent = <&icu>; interrupts = <8>; pinctrl-0 = <&can0_pins>; pinctrl-names = "default"; + dmas = <&dma 0 0xaae>; + dma-names = "rx"; status = "disabled"; }; can1: can@0x16111000 { - compatible = "ls,lscanfd"; + compatible = "loongson,ls-canfd"; reg = <0 0x16110400 0 0x400>; ls,clock-frequency = <200000000>; + ls,canfd-dmarx; interrupt-parent = <&icu>; interrupts = <9>; pinctrl-0 = <&can1_pins>; pinctrl-names = "default"; + dmas = <&dma 1 0xaae>; + dma-names = "rx"; status = "disabled"; }; can2: can@0x16112000 { - compatible = "ls,lscanfd"; + compatible = "loongson,ls-canfd"; reg = <0 0x16110800 0 0x400>; ls,clock-frequency = <200000000>; + ls,canfd-dmarx; interrupt-parent = <&icu>; interrupts = <10>; pinctrl-0 = <&can2_pins>; pinctrl-names = "default"; + dmas = <&dma 2 0xaae>; + dma-names = "rx"; status = "disabled"; }; can3: can@0x16113000 { - compatible = "ls,lscanfd"; + compatible = "loongson,ls-canfd"; reg = <0 0x16110c00 0 0x400>; ls,clock-frequency = <200000000>; + ls,canfd-dmarx; interrupt-parent = <&icu>; interrupts = <11>; pinctrl-0 = <&can3_pins>; pinctrl-names = "default"; + dmas = <&dma 3 0xaae>; + dma-names = "rx"; status = "disabled"; }; @@ -622,7 +644,7 @@ status = "disabled"; }; - iodma: iodma@0x1612c000{ + dma: dma@0x1612c000{ compatible = "loongson,lsia-dma"; reg = <0 0x1612c000 0 0x100>; #config-nr = <2>; @@ -788,8 +810,8 @@ audio: audio@0x16114000 { compatible = "loongson,ls-pcm-generic-audio"; reg = <0 0x16114000 0 0x4000>; - dmas = <&iodma 0 0xaf - &iodma 1 0xbf>; + dmas = <&dma 0 0xaf + &dma 1 0xbf>; dma-names = "i2s_record", "i2s_play"; dma-mask = <0xffffffff 0xffffffff>; status = "disabled"; diff --git a/arch/loongarch/boot/dts/loongson/loongson2p500.dtsi b/arch/loongarch/boot/dts/loongson/loongson2p500.dtsi index 23ec0f5fb..6ca564508 100644 --- a/arch/loongarch/boot/dts/loongson/loongson2p500.dtsi +++ b/arch/loongarch/boot/dts/loongson/loongson2p500.dtsi @@ -412,7 +412,7 @@ uart4: serial@0x15100000 { compatible = "ns16550a"; reg = <0 0x15100000 0 0x10>; - clock-frequency = <200000000>; + clock-frequency = <100000000>; //interrupt-parent = <&extioiic>; interrupt-parent = <&icu>; interrupts = <39>; @@ -425,7 +425,7 @@ uart5: serial@0x15100800 { compatible = "ns16550a"; reg = <0 0x15100800 0 0x10>; - clock-frequency = <200000000>; + clock-frequency = <100000000>; //interrupt-parent = <&extioiic>; interrupt-parent = <&icu>; interrupts = <39>; @@ -438,7 +438,7 @@ uart6: serial@0x15200000 { compatible = "ns16550a"; reg = <0 0x15200000 0 0x10>; - clock-frequency = <200000000>; + clock-frequency = <100000000>; //interrupt-parent = <&extioiic>; interrupt-parent = <&icu>; interrupts = <53>; @@ -451,7 +451,7 @@ uart7: serial@0x15200800 { compatible = "ns16550a"; reg = <0 0x15200800 0 0x10>; - clock-frequency = <200000000>; + clock-frequency = <100000000>; //interrupt-parent = <&extioiic>; interrupt-parent = <&icu>; interrupts = <54>; diff --git a/arch/loongarch/boot/dts/loongson/loongson_panel_param.dtsi b/arch/loongarch/boot/dts/loongson/loongson_panel_param.dtsi index cc8c952df..7c5b0d6d9 100644 --- a/arch/loongarch/boot/dts/loongson/loongson_panel_param.dtsi +++ b/arch/loongarch/boot/dts/loongson/loongson_panel_param.dtsi @@ -71,5 +71,28 @@ pixelclk-active = <0>; }; }; + + panel-ATK-MD1010R-1280x800{ + width-mm = <229>; + height-mm = <149>; + label = "ATK-MD1010R-1280x800"; + data-mapping = "jeida-24"; + + panel-timing { + clock-frequency = <71100000>; + hactive = <1280>; + vactive = <800>; + hsync-len = <10>; + hfront-porch = <70>; + hback-porch = <80>; + vfront-porch = <10>; + vback-porch = <10>; + vsync-len = <3>; + de-active = <1>; + hsync-active = <0>; + vsync-active = <0>; + pixelclk-active = <0>; + }; + }; }; }; diff --git a/arch/loongarch/boot/dts/loongson/ls2k300_mini_dp.dts b/arch/loongarch/boot/dts/loongson/ls2k300_mini_dp.dts index 8a27f7641..a16b2176f 100644 --- a/arch/loongarch/boot/dts/loongson/ls2k300_mini_dp.dts +++ b/arch/loongarch/boot/dts/loongson/ls2k300_mini_dp.dts @@ -18,11 +18,17 @@ }; + lcd_backlight: backlight { + compatible = "gpio-backlight"; + gpios = <&gpio 84 GPIO_ACTIVE_HIGH>; + default-on; + }; + panel: dvo-connector@0 { #address-cells = <1>; #size-cells = <0>; compatible = "panel-lvds", "auo,b101ean01"; - //backlight = <&lcd_backlight>; + backlight = <&lcd_backlight>; /* lcd power on control gpio */ // enable-gpios = <&pioA 3 GPIO_ACTIVE_HIGH>; diff --git a/arch/loongarch/boot/dts/loongson/ls2k300_pai.dts b/arch/loongarch/boot/dts/loongson/ls2k300_pai.dts index 45e273e93..2b27505a3 100644 --- a/arch/loongarch/boot/dts/loongson/ls2k300_pai.dts +++ b/arch/loongarch/boot/dts/loongson/ls2k300_pai.dts @@ -49,7 +49,7 @@ lcd_backlight: backlight { compatible = "gpio-backlight"; gpios = <&gpio 43 GPIO_ACTIVE_HIGH>; - status = "okay"; + default-on; }; panel: dvo-connector@0 { @@ -141,6 +141,7 @@ onewire { compatible = "w1-gpio"; gpios = <&gpio 68 GPIO_ACTIVE_HIGH>; + status = "disabled"; }; }; @@ -180,16 +181,33 @@ &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 { @@ -304,8 +322,4 @@ &sound { status = "okay"; -}; - -&pwm0 { - status = "okay"; -}; +}; \ No newline at end of file diff --git a/arch/loongarch/configs/loongson_2k300_defconfig b/arch/loongarch/configs/loongson_2k300_defconfig index 43198e641..522213461 100644 --- a/arch/loongarch/configs/loongson_2k300_defconfig +++ b/arch/loongarch/configs/loongson_2k300_defconfig @@ -1,4 +1,5 @@ CONFIG_LOCALVERSION=".lsgd" +# CONFIG_LOCALVERSION_AUTO is not set CONFIG_SYSVIPC=y CONFIG_POSIX_MQUEUE=y CONFIG_NO_HZ=y diff --git a/arch/loongarch/configs/loongson_2k500_defconfig b/arch/loongarch/configs/loongson_2k500_defconfig index 7c5be93a5..2d38e42ff 100644 --- a/arch/loongarch/configs/loongson_2k500_defconfig +++ b/arch/loongarch/configs/loongson_2k500_defconfig @@ -1,4 +1,5 @@ CONFIG_LOCALVERSION=".lsgd" +# CONFIG_LOCALVERSION_AUTO is not set CONFIG_SYSVIPC=y CONFIG_POSIX_MQUEUE=y CONFIG_NO_HZ=y diff --git a/arch/loongarch/configs/loongson_2k500_mini_defconfig b/arch/loongarch/configs/loongson_2k500_mini_defconfig index 0857a279d..0a60e2766 100644 --- a/arch/loongarch/configs/loongson_2k500_mini_defconfig +++ b/arch/loongarch/configs/loongson_2k500_mini_defconfig @@ -1,4 +1,5 @@ CONFIG_LOCALVERSION=".lsgd" +# CONFIG_LOCALVERSION_AUTO is not set CONFIG_DEFAULT_HOSTNAME="Loongson(GD)" CONFIG_SYSVIPC=y CONFIG_POSIX_MQUEUE=y diff --git a/arch/loongarch/configs/loongson_2p500_defconfig b/arch/loongarch/configs/loongson_2p500_defconfig index 1108729a1..744fed95e 100644 --- a/arch/loongarch/configs/loongson_2p500_defconfig +++ b/arch/loongarch/configs/loongson_2p500_defconfig @@ -1,4 +1,5 @@ CONFIG_LOCALVERSION=".lsgd" +# CONFIG_LOCALVERSION_AUTO is not set CONFIG_DEFAULT_HOSTNAME="Loongson(GD)" CONFIG_SYSVIPC=y CONFIG_POSIX_MQUEUE=y diff --git a/buildenv.sh b/buildenv.sh new file mode 100755 index 000000000..04e14ed45 --- /dev/null +++ b/buildenv.sh @@ -0,0 +1,49 @@ +#!/bin/bash + +set -e + +PS3="Please enter your choice:" + +conf="" + +function get_conf() +{ + plat=loongson_${1} + opts=(`cd arch/loongarch/configs && ls ${plat}*`) + select opt in "${opts[@]}" + do + conf=$opt + break + done + + echo + echo "Your select is:${conf}" + echo +} + +function usage() +{ + echo "Usage:" + echo "./buildenv.sh [options]" + echo "chip: <2k300/2k500/2k1000/2p500/all>" + echo "options: it's same as u-boot make defconfig" +} + +function main() +{ + if [ $# -ge 1 ]; then + param=${1} + if [ ${param} = "all" ]; then + get_conf + else + get_conf $param + fi + + shift + make $conf $@ + else + usage + fi +} + +main $@ diff --git a/drivers/i2c/busses/i2c-lsfs.c b/drivers/i2c/busses/i2c-lsfs.c index 1306eaedd..d348d2ea2 100644 --- a/drivers/i2c/busses/i2c-lsfs.c +++ b/drivers/i2c/busses/i2c-lsfs.c @@ -242,11 +242,11 @@ static void ls_i2c_handle_read(struct ls_i2c_dev *i2c_dev, int flag) complete(&i2c_dev->complete); break; case 3: - i2c_clr_bits(reg, I2C_CR2_ITBUFEN); - // 必须 delay 至少 100us - udelay(500); - if (flag != 1) + if (readl(i2c_dev->base + I2C_CR2) & I2C_CR2_ITBUFEN) { + i2c_clr_bits(reg, I2C_CR2_ITBUFEN); break; + } + reg = i2c_dev->base + I2C_CR1; i2c_clr_bits(reg, I2C_CR1_ACK); default: @@ -476,7 +476,7 @@ static int ls_i2c_probe(struct platform_device *pdev) } i2c_dev->speed = LS_I2C_SPEED_STANDARD; - of_property_read_u32(np, "i2c-speed", &clk_rate); + ret = of_property_read_u32(np, "i2c-speed", &clk_rate); if (!ret && clk_rate >= 400000) i2c_dev->speed = LS_I2C_SPEED_FAST; diff --git a/drivers/misc/ls2x-lio.c b/drivers/misc/ls2x-lio.c index 57f52eea4..f007ab49b 100644 --- a/drivers/misc/ls2x-lio.c +++ b/drivers/misc/ls2x-lio.c @@ -217,7 +217,7 @@ static ssize_t lio_write (struct file *file, } } else { for (i = 0; i < size; i += 2) { - iowrite16(kbuf[i], ptr+i); + iowrite16((kbuf[i+1] << 8 | kbuf[i]), ptr+i); } } diff --git a/drivers/net/can/ls_canfd/lscanfd.ko b/drivers/net/can/ls_canfd/lscanfd.ko new file mode 100644 index 0000000000000000000000000000000000000000..caa563423a6ddda9edd0cde8804b1ecd77242512 GIT binary patch literal 169392 zcmeFaf0$f#dG~*ICJ8||5XdHgq8^kVGq^yKT}Wa`=u?>+{tn?8jRup;}5G_xQC1jraea`2-d+$5@ z!O-XV{`0;1xvrdt2Kxto(Pi&Uethk@uY0a%$AA3fpB~)%)3;A~@7^DO=g%kDx@-@&n7?Ax z>NWP7W1#Y2=?lq|$-tjaHq<-&qjlACYG$?ic9tmmDdaomG>2fO6w}SOI>Y4ofjb^7Elr0C zH`FEb>&I0K1Epl~I9s=}ZK#Cpw#-PbG(RQtUou~%_GD)P`|h%BClxEFkHa=cKACL! zr&??6A8QLOyoQsKYSA92on$GofAiaiYK0}~Q2E+qsQj6|JI(LT(!lsiv3gQ6ufCyL z*mvrYr`YN|WHf?*2mct6j67DojNV5ApwUK9Ik$_P^KmnQ1s7 znK#zHWBbZ9?cWhJT|IlOZQGNBg=+_Qmal8uS^hv}XZeHa&hqui&hnDIJImJ$?JTdU z?ks<3?@;-}Lqp|{3=WlVwcO6JxF*@Zt##F+Jx<$NmlRKUdUCS0Zm87Q{&eXz$(_a5 z{Bm;Akq(tRlcDmxmZy2esmb^SHx{f`Wz=ue>E>(J#(if&siVuotl(4nQ!=dZsB9e(4?etl-2Y(uP;ogtebq##Hl6_4^GzgKuN`PH{4Cr_EC ze>t{V_{qQ3u72{{b<0IEx|6 zujQZlMgBi{M72;|TUY6_UjE#qWHFAZeIGdZ-ufRMdFuG-)nVIp<8~(1{ynH9wBce!%*u-uh_3 z`UuDJfb~&_*=_l!Iy;_smaGp;)}tls#gg@D$@;WpeOj_UEm?1ttT#*6n|8e4pB;;+ z!E<)})z%&y^BA{%z2ctO@gFZ;^vJb8&Uzs0qZxV69MS_f)w;3&qpT;6vwyYPOAF6% z^+i4Juo~Bz4lcy;K31+zwBERVc7) zfv;L^t=Gn?fBnynJavM_Jiang^V;`bT6o-JI|{Y6FO6A?_UcQ8HOc+u54G8x({_LP zn#%ppv$a z>+gQB&}s7w&KqB_W36lNP#JTP#aFJa{oNG<#;ezHKU7nhayJlL50&~jKk zvN*5)z}f=XoIZQfXx392yYG|mi%X)I?uCeE-KeK%vYkj%z#_R1I zU2Pb+WNPvspK3^YE#4RY@QGyL?NgFZ@0pTx**rGCP%T%cCFP-C)>Rs9o~qhBRd2`c zd}I3#&P%E`PucU+2W*}Kd-rQ9@(1D~iQU$GqB z^3`LLtzVy#+%jiMvhY}&@6Mi@OfgM^Z%-Y1U8_PrG%%t)g%fnNaheZc>6gJ-2 zog91VG06)S^W~pvOx|m8S6`LP+i$OXZ4UeA?@k6Q_gT-cyuWsJ*Q*N4S6MudT(zsT z`;GY=cCzJ!bC~h6@iBYrM2pY*yM+1YJvMLEzWLj{jt$nwZ9}DR*!+d_@A`!Y-}}h_ zI`UN5VGirEn&WuG9A?i;)hBEod!Nl?)uGY_k>ja)Zc>?LeX+)T{O~7}lYKWnT{_iX zV=lw-g!2;^o=-^9;khh3o~18W?#<`3d1kxi?KYpa-CwdEFIkV5tnW+K=Oyd&lJ$AX z`n>d^ww)#G^^)~^slA%dXa8}{kCTtQ^nb#yYOio3&*xW%CvKWs3C<&UsIM@1>UY);piJb6xF$ zeErtn?I>)uFn7YYR`r98x^E5XWZiO=HjN8b6M=vEtctmM@qkTJbZ=k@n>)uHkS z?bx_J9kOe^{M!2iZA0aO$B#Vq1e;%Pdunom>$cC?zwuV3Zvs&7Jezk;S zVBPT#CDkrFo^H2muug!|GK%!zRRnp|Dv~g`g2!RPk;1?q~Yl2k8T(^ zdv5a3{JF`%&W7Zn`x=sg8!E}3mBy;}XwN@-!qnuU*>;@R^ToAFaiyJ49%`GKVBZf- zHys=Db0@C5{dK;@QZnr&i>GAq3}5#nUy}}03){CQW9vHl@O3S&%`HL~^c|wBn(KNw zP1$>e@P1@*yPab`wxeLVEblwNTAq}AyIA{ve*9rwqaC-eIU-;GtgT;PXX`JmE$py7 zXpfK8Q{!wtsQoPWH$J(mc+>?sNGvz*j}v_uCq9ov{~#GI}TDi29iCc+f0jp zKX<$x6UfE5pFLQ>xnb6mlgFG}hR+KJYg5O!<=41izp#9aLmwa5QRKDnzN_+c2#znF zQzjhvcHyB74cRdV`z*hf&wZcTTt4|{)zT@(#;Q4TKNf%L-<~avxA(1Mt+SX*7IVpB zE?Exp_p{YJkDPDNALt3hZ22DU3-rpGHhYi!#N_0&mMiS%oAy|5c|!f)ZSMib+Glln z(uTOl59Mq zOjWeUX%E?X@NkZy=PVvvFHJH(d+vCs@V&YuwfB6BpPw-~d9*G$=?%ZBwb+H)g4(tD zd1@qIFBLvu*R!v&eZHqyE!yL>_Y{-j{G#RAu5CYT*RmgJ+gXOb9ro`h_HS7_R32~V z(If2GnqdFN?HwpwQ?+YgyAJ-~Uc3GsviIPFc6~f(*T!x4m#3NS9Q*fP`**$l>q>3? z(EX*ca#ej{Tm|#Vz_!WBQFeW5_kJ2S+I<&$oVKx$6sOqhK6`DC)B5bSU4u4UZm;ce z+U5587<)a#Ufbie8TQ)l`ZP?o*Y-GVvb{dqUjNG8zuDuoU)lS&&)@M}`IawlF8{^O zzb@bU(`U=K&waYQ@rIw3KYho~%AdO77v(>j`-}31CBGz(y`tKj9&SYAHAe{wQ7C8^wG&v7i=QM9?n_BY_(FYf=h@0a)8|DAGrbuo)` z-``uDX0yj^>~Y#2)1>z*Zn@#<^7JD`}GUPUHKH=uU`9K zS7iIFuWNg&?epM&+1zV6`Pa3Z%RjpJwDRvPwo`2WIU>2C(DvrKiuN^pj1@<{T|@1* zYcK8lSls(+wW;eqURb`X<+*ZoU7>Pn`|iR-(|bhn6+3n|MDw+4t=SJ2=Gk_o*FCyp z%sFSsd>*b298*ty;MJ$b=CA5^>gL5_PP+2*&Ee)K<|nJi-oiZODyCzlU902x-fT8o z*4s7ypk3ov?Ha$$uJJ2&ji26MvN@q-$8yPz<&quCC7TCIHV@c&E5F8%)#CT|XU9v+ zK4!JiI5o$y_@1-;9@aef8D3B1$0F_lj@4_w`^99tE_kl|to6|5f2~_SmJQCWwJQ!} z*Y{aoZO$9Zu6EkNg|DPvUU!dO_x$xs3(&>K4?6`UTaRf?EJTKusY^-J&u6^JEsoRJy@!KsIG#0Gng}~J#}qZ zSKXK2+phlH9&gxHs{S~sAg9RRDecddjbPi*?U+!_g44j z?`u!yes(^XU6a@T;H8DCGgkX7Uw0i?_)*J;ZWHUrTHk?%Sz(6l-o>@e&u<*c z&dIpe!8MP+2EsYK_LbjUQ9ZHHhU@E}7j|ZIW9@ch6ANvK2lvIZd#`qlhdQ8++54t* z3-it>-c=fSJSPrqeX+OX&C_ZA1f{<`GMDR-5QK5#=};I>+_ zd&Y^$N6$Vf`Nbo3%O6VC72jh1kGK2mxc(kL{f1%x^*B#izhZwU+_gFD3oyQyqmHAl z-%)5hqEftNdqXnmg&l=;)oO9wbh{t^2!KJcx=R^uOR znv$GVJioYgrCrO`-B_%@Z%5&%Z`k{}b8WkCO-Z(Vxgq)T+-mWxwUy!?dq0Q!0~6Nm zC>&eeQF!RKhGdJ`ob^_-{jR^xGcR6YL(?Pc4s=Y`X~uzF9c+b9TKP;=Kd>-qTJ$YQe3AdW-$t z3pW(!%$kxs@>TOa%kDMJtrX8#dqZ*S414{RoMrc_J1hn}7vtKT`2jx_^M0FSmPgDD zlRmwzJyZT-S!&)V}xYE71GZCz9;-Shm^v7wYDn_NFhD{@u2D#{NB> z+*q{Nc70#9&jt>ibH?(6b49fp_PgxB71`^Fbsd^F=o)K#?Ca;Tb;f5~eaGDHWv)B$ zz6o=ffA7>D-Zvp`yzhXX-*-+PYrkh&{txSX{E^xrb6YG2`(E{`Q?t(xk4)y(C8sC# zd;hwK>*PuH+2Ad6hYCYqy?XXhPuRU-dtUwe)wA)rVg5Ph)w65I9sYi5U$OfOa$bmO zs@;`ePqbGL+Wmjr>qjrzXO5MfcK_c#kKAkb9|rCIRCTEQp*H*cv0|S;ruN=^=={?s zCEJR~^Ed3@ZRrE0_2-RSJSn-Sxc&#lE7uR*P^wRFC~Wy|@yau%B&XNgwetFJ6_-yc zK2SR9MEe}<-ea=+PP^Y-?5Z!GfBL`;bBon?Ci5;Ut}E5sIrmF;PY+7z{)*to#^UFv5koiJ#a(mCm*Y1=c~`}KQ8&n z(Usy$*4IP7EY5=_+G6he*4j!kV44P2=liNYSe(~bw9nk_bBv?*zpY_Y-4n?tzgtN* z+5EfbTMc$jND7<6oD6o9+1W=J4Fg}db@m!_^HEmA0h^!iGp&2xm|WR-TypyBEB3i_ zo1HH$o}bvdEoS$VCY!UY&gWRZ-}R%h?>RhT_g~gk<|g$x*KTV_eqnKp-;l@p`RnX` zrNyw@Y(5G;lyk%d_7K>kBkWv@3!ndOvd@vLZ%gJi+PsL7e{|j!S~&O-HS)hRVUR|vU8WcKe6M{KC7_L zUK9K5b+6rT8?yUtgLa>_I%JlVtuUISIUuN?~rCQi>Tdg&lFYFp) z{SRL3u6-guZ_c;a29CTxx&7A%TgIBNk*C^^4ldNZ>O45lYCY!mw(r_SwS^OU?6Y#q ziNB`S9F4WTZWG;4WdF!x_FgCC@tZaW;lA*Mb^kp*wZ22IH~e)5=Gf!beY>#b+~i8k z;kC8@eg&>Os*On-YF%6VLjJlLulJ03PYdT?^f%AHJojRI&Bs_dt35EHvAyzA0r%8! zZw~j`c%O~;-|T&RcK?m{?XV`_VH@w~M4dWi^B)dO@`=Bd_hRV1vcdxyNc%8k@ z?s+cA?=@j=!9CN;MrSo!@5`0E%N8Z%eb&Ess2x*$3C)fXh2Y_6Ph+yzNvA3k%f6gSzm{~Y^Q zeS0C>&mVukQq1N%*;mG#_OWuxd%E~;4zxkjvsXQB?}6>J<+)EL;|Fctd+DO=I}EGr zT;4U9zkkJc+4p?5jl{?8aE}F9aq_X{tuJ& zb{~1mF-aHhC9m6dZ1VYWL&Z$j^CQ0TdcA2HKiTFW^Yb-34?^qS_N206aHzE0{104T zDXweyPSTN}hC}6l{BWiC57WMrTx9mY@0zZ|Y{tq@r+xMlTbF$wVaND+>2c#KduJsT zyEk#jJ+j!gU6zw)ue!5zLM3T9v1;ddJI~wea`nf>$|{?)?K8>}zORJOD!c9V-jkB@ zD*Il?I*WUyeYaz`9rs=K-Hv_sIpvlwPfofb-|axpebi#p&%jRwbNw>kj)89-VYQyS zskr6nmsT}N>{T&LmM>=x5;%k1NmJ*MIFmV5goejcvz@HzVWpVwNw@8R?CO?8zg zuc=*x?J-Ahv3@OiTb!%0KkVy}>&g?8#T}9PbHMEB57(RA-|aWOcu{t~ zJEl^+{kj*&Jl|n{y1nzomibM)liUC1#TMl1RI9n~0nSeuUyy&c6`P-K?|88#wyt*R ziwiZMyY1Q(HC<;lT~}{92kI8r*Be`0%)Y-i(3o8LV5sp}$6;5CT}PqkTde0z`%hZ( z&s-i_lV3xzZqw{MRhwn!_0;BrEFWW^|7-0B7p@<_GkLw$f5)G{coD7@UT=DC|M-g+ z9btKS+CF!($7xU7=S~xF?KAzBL#}VvQwg)Onb#5{b zx?l0Jxb}CgwQCP7#2ip7+C97%jX5GrP{Ky<_bAy02u;eD;lZmN0K-bLAWFEU&z4mpvaU*kid` zw(odYj!vlBd}{9 zXzQFalE1RN4yARKJ%4aU@*R7=w^UcrYZc@M-&GqcKiG$@D}CF(<2=@OV{HTbgZ8=c zBe(R@S zI_&Qpyj=ZipF6Nn&zqW~+Aj|tVpIF!!G(GZ)xLLdVWai!2kkvp*IK(a3ZJv{xCI;Q zv-WW~o~OLD@Y(b4%og@D>sq|P5R#xmYNIQ2PU9fXy-G#+tD%HZT?E5|Ty1d8k z8=i5_lmxlLcjAz*6H3+_W993M`xicY`JJWb{&{o0kIU~Y51nM+bF$-gg89VvBB9fI zFT0*W4`wyD*JIYt*5kcp){kMISwGg@Fx-#!8REicXNH(&T1>|z^Qf=(qZbz$1-N)~h;udt2MPSFh^t?B&k59;;ShMepjKep^ZI8MYzs z?&)0RU$0oz*V)_Oy0mx6%1+NaRxWAn?Of8)+Ph|CrSsF%+kI81iCVd`JM)Ka|7ZM9 z2L4}XAoT69Tf4|i{@DK6d|~(f@_%>^j>oa=za7@S%^tB0>?Vds9v6M9`|QZ*7xD@6xXBYhPuK;rpCZ`WjE^NU!bg?MTD1 zo7z#@-TRhPI?U$$cV2W-+OlNTs_y=@ud_eBYDItlij^x?ElbZxTjpMtuINiUS1q}! zs}sgHIy$de(cYPMtmsIwNmu8RYdTZY*x8@2Kc(+2Y0t{mUYjIVtn9?JkuF`b!Zt6R z(or^(dHMG3UES?hXC9W?eA01dzOnhAztHx2;k>kO#j;gP`d9aMju>S&z2Qet7OqVV z>5?vU6!ws<4{18X##{S(+gq1(bo9RIlr@cf-g@ndj{fCF(w^QG*PQWI%O9qgt5z>P zZ~B^3)(q*1rBF zy{v1#`SAKQGzjBi->g{G-nF`;^Q@x$ zs`UMR^_mcT( z|C;ty{pSsL4!9+*<%0QHT9ZpwU9+Ui4wg)9YKiO5PH#zvbzf(1-&w0V`?G9x^`RAx%v|aOA?!EuIp3d}?uGNicPj_Gb zWbXWybVWz&(iNRu9XYWB98Yp}Ns=i_(dNrK`z-qImFX#cXqZ#_GL!bzy}g~Q`cvx| zJ7VnM?OxrNhk+XOFYmNATiJP1T3WfH4?RBI_ixMldr7bD(7F&!)z#e>W{D)Z%G_kC zgAl~o*T32(g<%hAX+>Wzj!Fx=+-PgNdwOhQ$~Wj=bJcrK>3E;z;Hpf{>b}f!29IE? zLF>Xra~ECEdcozFzvJ@Oxh;z>dDjI=qWp@vmtS_tWfvX77tCF_5F3oxpa0HCyhHi?3ocjy*ETnF+SSc@7cH1?(`R3M?}{FzHK%R+{!%ye=ez*^2xT{sx0TJi;H>=i9?B-(UVZ`M-Wmzm@FCNWS@+>+{EC zxE{J5uc2S<_&R?qB-67e`J=Z7$7`CRl0x7V8-e1@cfT#w=H{G zNVbJK;1PAE1z(S>$C^S|oo_dmy>8Ff`QxGap?<%9Bp=-R_va-w)3LT|%Ul!^JYs!Y zh!c7u_wV>;Jhv0% z>aNb#t|ixXug3k3!yP-n_UoU*)~@^P0@!YuEbTtrO*6X{KfmuZJZWup@3K~Obafu4 zmmmJ{k-vc{ug}AKfy3N7NnUs9<9`O@QTy*$(T6MT!*Oy}<7e-N-Kr%$D_UQ{cJ%#$ ztKUB~ynSE$^3JRbcpFBGmwz1pnJ@h-EV4I_2)@;>LR`;b0VC`G6-(`=-tXN& z3?BUC6)ys<>|AN@ab@LUyli^a?ri^d1ESCF8)k2W4`Z`olb&}kxEC*S{rziN@fNi; zd%HSp^Kwrn*WL6W*4y2ORsC1LoaNZ-&N#DJ#F~)5&h}1wANdOU_h0__@5Z>j=RI19j$f) z<8VAY@ZD`KunX^bS~-Or&bF|5^u8A^$76QvzVh}-e)82Lv;J*G-fZfDuU9e}ziIC% zZQ%IJ-?g`{>|cHO9`1i&qkUbS{bM5R%_-)fCGE=(%gLAOX1BsH)BlRkUP*G_FPCn? z_Idw?{daU8_WmFI(?7iw+Yk5OE9iY}chSf0Iu?(s`?@+ids=&O-vh4?ceL&NgKT?u z_Ra5)9;SmE9=|9%{##qK-hZX-mz;81(?_wZR@{VZzuJ1>>Q>yOJIviDfAY1Pro#5> ztbq^zyhs1f&wlYqJkQkI$1Xixo&BAy9o?%AGmE$W<>KsIWA*=U9RZvF>`y+9{oBSX zTf<2ZuMc+|-B>vtw(dUY;clAQ{lU;L{}WG4zco*PXBTd~yaEq)V_UDA8l zr`~KYcmDfJ_OWY{V8hlvyU*XVq{F>H_dud8#_%#N;hygcl2%!8kL z0mj%KpK03dwC-0Dz!_8i@i}hav-*{9f6IrD|17u94#8I_;1B-rk9K1FY}>;;=fVDP z2k#UfuKoYm{Z9t|f0==cT3X(cma_Zqb9>vDr}jr0?PHPdE}JY@tV(;^XPnt|#*DNy zbNbBY>CH3GE|=5UXEvQ_w_pC-8~)xj7PC)`4>crNXb@f%@$Kv}M$vv* zKGrBEM~;Qf`>P|oKEfwO_)!r)Il}F)AdE4JcK>OtQMA9HHP$F*e}VJRHAVZL=UAg? ze=TsVQM7Nwjx~z**UNO^hTyp5*EQw#cN?s_lkDg6`C!IR&G<;XLm{||wqG7>?) z_J0NYG=Dj~{NI6}G)(d*_>p^Je(d)}qsH0B3$D+Z@rwgbgEjek0jkL9^=rtAU7ZG z^9O?cg4gFO9t-vQm&|@-9th#uZ^d&zZNU$9?hiZ-oJal}vjgXhGcEAPZ99zV z`9so}aTWzX4a`SN;CwwJ@IMYbyGS>7R^a^^ADOp9`jSrv&ewe05;%2`KV;m#0-bCK ze);eZf!{+A9={j(ZsCswzESw&fwRxJ`p2|q;=_u63w*&yXxW;l1Ai)eq?aVw7kG0x z9=Yb%fo}`PE%|>2en9w(fuqi&MrKz`>a+DDYsLq@S^T^z@HJw8bl{7GHw4}+@tzR) zV$t*Zz`Ml$O@S}S9!GTAkMV32lXE3MX9SLZ^kZh=&&Ymf1wL8!dv4$d#LwJ}vztfu zaAB}NQS@9I_;&G=$5Tw~?^li*?+W%MxkPzy;HlWR1A?32-xsm}P2dBP&;5aqx922@BzNj2^+KpzCi4k zX1qSJzqvSSbOrv5=i~Xj+dxYN+vH$D9$BF&cjMv-$I6&q3<5zji;Xe+%^oG%Xeir!gZyL@2J@CcCe--%M;^%({J}CUfz@HI6 zb=mbzG1-`o-tQ5CUwqPNJ}K~2_>{oc2|pq5M}@y3@aH8zr)0c7xw|lWzi$rq+of-3 z1pbWppB4B%;pYYaL*ls?>S{O|3u)6#Qx6$PsRUd0&fsK ze;N3;Q%C#1EAZK;jpl!o@%m)1rGfp0u*wEfPE*C+Y=n2~kg z3HIy6&m)1)mi&A__{raAjQIIi`Z;ri;n|bHet&jdKeF!U!G43}^Ou45NdA8v`0VnC z4?O#A;LnTwOMyQn{)-c_mA#J;KSu`MCh;B}_;TS>13$45{zk@Y1AkuXbyDEFMdxXO zr=sVKzkfRj^wsLXuN3~lzka2roCj0$Zu-_*8T_5c8`yV4Q ze>&I?iT~RIPkEy;Y;t?x8-;%%@arZ2U(9%YvO)6p<-mJ{-y8f?ME|z}pD+A@z<0}j zzZ>{w(fPf=7YP4B;M;`%DC70X@#9BwhG#zwe7f+b1JB>5j%@R6;B8|6AAzqC{=2|8 z2(KAG2KSjm-lm6LOgl0;Pc0 z#`VRB{f>P*rVvHx&{-xT4uMfhJu z_+N(pY^%!~p(pgi)`J5j2Z)=m_JLpKE{iqke1mITTPZ|ur&VH(p z|Cs~J*oE)B%zn!Ij>}qG&phXx88hrpb%(!D5s9@|!yDms$C7^g z0|5NH2cuRUO0z$8Fl>|kieUKFA%7#KwRP$0RqaqZ>zp}rhV44+8;7=E>!=Z};rp=N zJ$)AA@K&>$N8%g#<^8au?2o80{^8$Edk5#tZW^}Eezo7a2H#h0&Axcr*>UDMO=q7o zU9x)iIWuNCAEq4LJFMxPrjbapUys{2k?qF}%OHH@;0Ql@o-=*MDC~a!JZCy~JhDap zOXt~^C-m2KD}AGn>aIgqyS5#@9S@K*=bxRNIp2;fTQu9^9Q!wO1{SkzaW)oB)A0-| znr32=J)4DRnF)+%!$~vN&c@niyqpb_<~euDa-H>6y)p%;p@#GADC7BU^b+7Us-+(|jYC zv}7jJvt8sA5@zK2$PzNcCNbRPfWvh>ZE1Cy3)^8(yvi<#MS#vJ&bITI^qTI1NVIeVUEdS;f)nOPQQ zX6c-nb5GiPT* zwSB)YTS7-m?mc^oyv)p!J~PYI%&eVS5I{?o*On|RHa`JmySJmtw#l+Jb5^$f*%_IQ zwJmmvz%q+BYmS*&0%vADGILJGvleT~OI?7vY%w!m+K~1VxhV^|DJw-wo`kHpO*U!4 ze^%(+rYUa`q_QO|Z&P*{wakQ`rmUn*S&f>`hK6RFlZ@xb<*dvmOI!0fndhwSnr6X& zQx!nV(VDV` zYRY<}Im>EG6ZE%aGh9nHVYOrvSW8yH7ON3YE_Nbp&HpY?>&hi-M!tQHuhEbG8av3S zFUGgF_Ag)2hqImiVD`}O-TN={ANr#J{h7fSda~0uL}k|rouhx!(AwH=e*}nIh4aLr zznvIuHtK8>PR!X4HAesF!~cY2)X!1ECir#N7(bI4`Q?odH~S5b{wV0s9~q7M+0t-w zvL7(mUhNl^CIr9e3csit`IXkFwc+<(NWJ?FS!N8;SwU^3`8xD>a%2ARF84nCYrbJ& z_=yXC9Ej57F#omT=zQ}moqOqZziAA=lFV0({;}n#A8>|Wg9Zm{vM%GVQ}ecPzjPh- z(^;&|;-xT`^UyBC(G34oc+^j~TC*P?XNbRN9`)m3LjA?{D5LBb+$J9h%YIdNad_W` zk6UMk_i{kw__#a9VV7cIgZA=q$1vx|=8d`eFqe;6hWVR=9Utb0C#uJDnADEW4aw!> zk%U}s(++>XQ~fV+`^D4x@S0rXCD(Y#HC}R!caht#&%fs|X%2Se>Yuz6?D)_Xp5SW> z^9b#cywNc{9SE;se?fST2lCS$!_!USHS8}8&+$O6_Pc@&>@Nz>@j$Nj4+k67PcFB0 zlik6-!5+_deNK*g#W*%iv9LjVtvk8aom}feu62Jj-%a*Sf3L@Ln6S^uwa>}5&mW8U z_Z%km!H!(xCD(Y#HC}R!_wk4x&tcLW?8wzWx%T<~upRp3;_w^~lN1t2*M`4g_pWGVk(I=OL=h%cC@y0mpQY>uH{-pfn z@RD5fMy_#@Yu@bd*JnfZcn$;h3Ay$Ox%SCm#J}h8&psj7c*!+ha*dZ<I#_pdtvk8a zo!?7S|DMA?>rSrml54!=8ZWuV+YpJ@bLe5+$<;r()_p;`R2n* za;@WF(5ZSnhZFWKx%Mr&_U-0~f6w8+9t#`f8ZWuVORn*fYrJ|1j6Pp*CY zRPc|!y$p`RAlE+G=j`7>V|yf5`vcB?fwL!9`xC?G|IqVC&YoP4i}}v}a%WGj{_*=Y z4ESG|JYv}gf&C(9PphT;pcpQ=IaYU}i(cKaMp2L4V7BT;nCzc(+9Kcn%#rj>y$NxgJN4y1x2D zI0}PY`|xpRe<_XakzD&~ud{!rvnN;k{m%Yf&YoQL@OO0R^DCS^x!O-0mm8taE3VJU zQLh-smMIoCXs>lA*SeEyUC6cW^+BiV@f^*W)>KuusTO26Tg5`($y%zvpnnJ|Wk5$u(Ybjh9^Gy)vT5bLe58kgI=k z?USzHAAPbIj=~_<`D%-^e>aWokzDWBZ4373s|)K!HXuiSVjR{f7B*cBRT3D<1kOLut9t66LRena;+n|_DN5OOZ9jT9Xu|`^|&C{ z8ww zg$>$k9>_Hh?FS*7`uJMvI@l-V+9%}NCzB)oJ%@kx3Ax5guJMv< zyyO~hLqw0~(8E3$k9>_HhFY#>rSqHb#c(CdOU{?9!KQ9N3fp!G`w(Qe#F1$Fs~2WkZZi; z8ZWuVORn)Qi0JVgQg|GZtABDmjs}8%^kHX+2@mAjCmWspQfE)D_M4skGG|Y&_CwBo zxw9wN<8HUJU*YV@)&6;B|0m9#T=g7q_E$T5aJnOIrvAP_#Bbz`Ei4@UqvVO zNUnW*Ys8*h`*6_NcRT;&YCq)cdz?MF>e=P&-|y_n)&9|7kK>|JH?jda>Ko&*PO-2- zd+if)?GtjXBf0j;V?n3t@f(vHR~wvtpR*@d|C@q6`q0;g9QllKxKFXLL3^zWxz>eT^G2?9 z84NmAkLS?AJ|x#ZB=<34yUh{*p2LoPNUrgcYrNzdFS*8hcSMip(8E3?SO4VNhg)3T z`{5`Ia_En7n5J0RpuOgST=PJ#I>|K;+gu*J9?zkJbtl)llWX1YiTL*%{#kc&jh9^G zCD(Y#HQwzJJ)T1k>rSrz$+hl7uI`KK;3*&E&>!QlOtG**d(8v6=7C&wl4~AzxjcA1 zo?FS*7`uJMvvj9yVBcVN{(Bwdh&RUJI>o{U?KN-Ynm2Ndi(K>el*^mf<2iJ&Psp`T$hA+NiTL*% z{@Eww8ZWuVORn*fYrOj+dOU|7_6fQAC)YmNAN-?Fu7RU4$hA-EUzHoc{#qK_BYC4^ zczS%qo?QLUcJ@o0FLL!?iP)2?fBrps=wIXfldJ#5&i{4Jo?PuaoV`Ep$WM1Z@N~Je z|A1RZuKN3({Rf>rx!Pav?5}tB4>x9RBOEutBczl54!=8ZWuVyD_52bLil_ zL9YJEb>6_=ufssy{r9iPp+Cm4U5bSb+G`%jH4o&flU(yK=T;nCzc<+wr@f>h8bqL=OEij{T-s*r2`Ufn4)I zt~$vz5BIn{cs-s&2kTC*btl)lZ;$x*9R68%a*dZ<<0aR4$u-{lB6>WB9@d>){gZ3m zpK^8g-*+O1{usx8Q!H%IUh_b%c_3Gva`jKHebN*Bqfb5zM`4ibb>rj^IP5<{V|ygmzG`sxRcBAG_9r^~8=O7)>5k#) zJz>mBG=>S=7@jK;XjlwA=h}xHC}R!mt5l=i0JVgdUza>tABDm zjyAZuzpW0Q@<9&$F%HWV3mdf8JdkT1$WhfGp2I)u zPOkBiYrNzdFS*9MDWb=7=waQ-)jzq`{qEo&^T|iyC=Bv52*Tri&fd>W8ZWuVORn)Qi0JVgdf4aW>YrTud`<9= zKKVEtg+cCn8LKu2d-Tbl23yY&Z;Zn(#li;tXx_**Z{!*mx#sO|mp8A+bLe27kZYfi zYoBb1`1c(C*(c;0FS*7`uJMvj^FXdT$u$q#T^_t1&!K~LC)c`@Yu)dQ`1c(CS$A@cmt5l|*LcY_-l2#d&!LBP zCs+UETKC<-Kjw!|z)=|FdfurIfBzEm!xGmg!ZjEKV$JkZZi;8ZWuVORn)AAJOAEbg)mz)jzrR$vRhe{>?!6 zBZvMNhh2(=4ccoS$Tbh-s*_yvaI?#U*W)>KuLk}Z47xmcJ)T1c z>rSq9C)c`fj`;T+{#kc&jh9^GCD(Y#HQu`;dOU|7)}37alWX0#ySjI{x|2hHjAOqk z7B*T+O&Oc}TV^?=_=#O!1mttXq_L>KB%>%jWB-cDl4?0zk=g`5rlWX0{ zweHOk|DMA?>rSrml54!=8ZWuVJ3FGsbLe5+$<;r(*1Zz^<2rBvj=~_<_lZ5hzQOGL zaYv4LV;rtiENswT^G2?DBiFddHE;bcZ(fh*(7`?-*FGWFK3Nm-?>YRlPslZ1a*dZ< z<0aR4uaD^Q9D3L%xyDPb@sex2iiHi@YaYlo59F$oT=Vd_%Y)bBIdrh@rSrml54!=8ZWuVyEmf8bLe5+$<;r(*8M>6kL!V3;3y1oy&jl&Ol|=C zPtw>P$r~NR(|TvW!L1|L`%aUc{hv8|a4_=Sw(80QsYu(AU?wce2J%@kRom}H3 z*LcY_UUH51?uZ`Gp@(%RSO4T%_ie#H=ATc&Q5fVp{|p6t%nxsNeL{|SV;rtiENswT z^G2?DBiFddHE+9I-n<^qp@V%wu6;tTee!U`zvuAJJ|Wk5$u(Ybjh9^G-5t^6IrOkk z$kji&_Q|8J?)<-C;Ex>oV;puV7B*#Nv?T#!R5j0@fcXF*exz>Gu#J}h8&$^Rq zyyO}$xyDPb@g9ii@f>{0s;9QtD%+of1w1bfW`x#odfb&`+T zr@0>&(c?K}uT;r{e=_{)tUI~Zom}gFe8j)!@XxxFYrNzd zFS*7`uJN82(c?Mvu=h0#$lIYVS|1& zZ{(Uca*c~z^R_PNR6U+U2m6Fv`-EKkZ{s<( zXP=O3pO9;xY>D{y9RArS8+!g$>$k9>_HhX=4pFAJ@ zqfh<kGaI@nj_+E?V-S0_jOdk+8XD{_sOT;nCzc*!;1QbdpE(8InWSO4VNSBt1G(xX*E~#jdGLBXhYr@ATFm8Pa?jwZ!`a_P=Z>rY zo1Oh9$lsvggwgMCh}eNL`@ zzA@t8bNFYUlWV->8ZWuVORn+W8qwo9^svv#)jzrKWo$R->i&*8kbICse~iO2#li;d zH4o&P2XfU(u6fw(^5FG&4jrsJxz?Rr>wb5{zvuAJx|3_X208S{I80M4Y|viwK(2WpSDoaVhar~-ug7!fVBN{J?&MncT@nAD z!$0dzuJMv+u{qSa))*JGs{V@rZxV;h%LU*LcY_UUH3>T;qKrqQ`USVcp5qKe^WZ zncyGSGn?Qj4064Gc;4CnC5`QoywNc{o!F2AJp7UCD{|x~#<69Jg$>$kp2;=Ol1Rs8{_btVqt^!nm2OI8@a|su6dgtbgCZDp@V%wu6;tT zebOB9?>YRlPslZ1a*dZ<<0aR4XGipS4n56S*dSN``{Ljq50}j^FXdT$u$qxyF7S3ox+BFbD@>kT(*9$Bn@r5A*9rR+1y$7>9L=g$>$k-pDm?E&DbAi8@y0mJQ!H%IUh_t-c_Y`j$Te^G1f8nKbLe27kZYfiYoBb7 z`1c(C*(c;0FS*7`uJMvyyMli_`1^k3&>!R2Uy6kd+G`%j zH4o&flU(!gu*-wj<2iJ&?&Ml`a;^LBh=0%FpLHkKc*!+ha*dZ<<9#%u$8+du#=-`< z`X|@AKN0-np}j71kuAufKgMC0Vqt^!ng?>t1G(xX*F5ZXdGLBXhYr@ATuNrQj%$z5<12D#qPyfWCMPv+IpI!VY8Z;Zn_#li;dHE-ma zH*$@OT=UlE^5*q;4jt?ha_tjx?URm(f6w8ceL}ABl54!=8ZWuVyF8-DbLe58kgI=k z?UOaG?*4mLKuvlYY=)yS$aQ|WHP~Z*Xri$_k|W+2hk1&H z4ccqo$Te@|8W*|dZIjEJ*W)>KuusUfPsp`T1|$AGhky17xyDPb@sex2{>imZ?sj!w4@Y5;Lw}6JG{wRO?KKbNng?>#Nv?U=;_~42cn%$`JGs`KTT;nCzc<+hm@f>rSq9-xcxiIsCKkqxG7Cf7Pn4mwqj=g`5vCD*9t`1d@E6AK&U8ZWuV zORn*fYrMxt^mq;(>|1j6Pp*C282sbmZ{R2la_!sc!5)2brRx)N#2e#qonm2w_L?_x z%^SJKMXq^kc6sx9JckbU3Ay$Ox%SEIh=0%FpYt2J#!Ig8l54!=8t=IgJ)T1k`-EKm zlWU(`9Q@G`2@_#2e!$k9>_HhT;tsq(c?LE@Hiq@|KxfcZ4drYcYpt%9IIm-`%SU1 zL3_;ux#odfb&_iy?sIwYdOU{?)}37IPOfzyium^&{#kc&jh9^GCD(Y#HQrqjJ)T1k z>rSrz$+hl}2LG5p{qOzBb$)m}*rQLrf*prJj@2;^(-aFEwAZ|mhusX%59Asbx#sPO z;6U|w4jt?ha_tjx?UTI`|DMA?`-EKMCD(Y#HC}R!_o;{;&!LBXLazSFwNLg1|ERma z??H~$F^>JFSlFPw=7C)EK(0E;H4o3bJa|2xLkH_lu5~BZy1x+d?>YRl?&KOTxyDPb z@sex2`y+ZhhaT3QT>X=4-IL?7b&}}(K(6z{#9)s;xhLB)Uyws?jKea;!UpX%Z{(Uc za*c~z^Hv{psvggwgMC7-eL}8%GCAVkbNFYUkZZi;8ZWuVORn)YMD%zLJ?s;5^-r#S za=fd%Kkmq(KgO}&6bl=)*F2DG9>`TEx#rK-*fn9-N`jx za*dZ<<0aR4PmbvE9C}!Ha`jKHb)O#mV}AG|9ECxy^Fwp6Z!o*B(%2r!5pRscJjKEW z?KN-Ynm2Ndi(KIb9_G6|cs-s&2kTC*btl)lFNpZ} z9R68%a*dZ<<0aR4$u-_Z5j~zm59>~@{>ioOYh2ymR|ik|Acy`Khh>U|4ccoS$Tbh- zs*_yvaJ|ce*W)>Ku%jSfn0TxYaVWOdGLBXhYr@AT9^6?>YRl?&KOT zxyDPb@sex2gAqNRLl5gtuKvlj?puO?Tn}u8qcF(zdSF|yZ!o*B(byiz5pRscJjKEW z?KN-Ynm2Ndi(K<|kIS3a<2iJ&Psp`T$hA+lNBnyZ|LhZTjh9^GCD(Y#HQxIodOU|7 z_6fQAC)YmN$k9>_HhG z24}yW&h3%h`@rgxoxNX2uKr8T-uox_KH&diXa9A8FvuGT!sC_B{u^!`x%yw{?7!*k z$<=k4;KZUs>gHa;BiN;#~ryIcZ(zb zJ%@iDcjOu`xyDPb@sex2S4Q-B4m~{X$kji&9(NtC?r*7sr+kn@e~iO2#li;dH4o&P z2XfU(u6bDQ^5FG&4jrsJxz?Rr>)sXd?>YRl?&KOTxyDPb@sex2JrO;gLl5gtuKvlj z?$zKQ^QWIr$aQ|ZIoM-<_!f2?207x5ahRr9*r2`Uja>6au5poT-UeLWydKY?gMC7- zeL}8%vLWK%bNFYUkZZi;8ZWuVORn*5jOg(kde|rA>YrTuKB%>%jWB-cD_a(VE2Jcka}om}fqu5}-b`1c(CS$A@cmt5l|*LcY_-pvs`oeUXSO{ z!#*L`J|WjWc|PLbbNFYUkZZi;8ZWuVORn+05Ygi~^srCJ)jzrR$${V>ee!KM3WHp) zGsm5n8^GT85V>cttatW1@=dcPx%zJi_UOa&>P9voM?Pa5)+rV?Xs>l4*Se5v-pI8s z#|NFN$8+dlAChYyl4~EH81e5p{Id_qHC}R!mt5l|*Lc&29?zkNeMqkU$+Zs~gMakZ z5FCX;-bfH0=LdWA$vJKvIpU3Rn5S6SpuOgeT=Pb*agl4@7P!25J)T1c`-EKkgk1Y% zQN+LJ@XtOW*LcY_UUH3>T;p9F(c?MvuusULk}Zw7EQZJ)T1c>rSq9C)c`nMErXW|ExQ?#!Ig8l54!=8t?Lm9?zkNbthN< z{yYMrycpU&-(T>al1>@oj5;Oxnf&lrb!iiHi@ zYhB2-F65dwa;?ii(5ZSnhYt23x%MHs_Th$zf6w8ceMqkHl54!=8ZWuVyD_52bLe4D zkgI=k?ZZv3?xWtPxc$aB_M2j1gMKs*wxg96DHca;-bL)_rrtzvuAJ zx|3_X%Kks$MN1+2T%DRhyECcWr~Fj+G`%jH4o&f zlU(y~pUZ>S<2iJ&?&Ml`a;^JN#J}h8&$^RqyyO}$xyDPb@$QP~@f>$k9>_Hh4*f9>%M=S6wAVb4YaYl|C%NWfdeEtQJcka}om}fqu61vY`1c(CS$A@cmt5l| z*LcY_-q{g7oJXBmBydKY? zgLNm@x|3_&=SBQ`4*#q>xyDPb@sex2~@{>ioO^IhHjbvrrq$2j(z zVqt^!ng?>t1G(xX*E}q6dGLBXhYr@ATYRl?&KOTxyDPb@sex2iz9kG zhaT3QT>X=4-TQ-o+)vmAM`4ib`~9l3e~`xZNZ#lep00ED54m;ZdjH{OXa5~%Pp)BW2>YrTuYGUw@y8G)2 za_l$8vELL68?@IvkZT^uRVTUTq2A@e>+u{qSa))*JGs_T#q@XxxFYrNzdFS*7` zuJJZR^mqC`A0YkgIwo_G}xn0cGK7%$q{di!#u^p2JJO(KuusUfPsp`TN)i8_!$13kT;nCzc*!+ha*ek!qQ`USVV{tze{$`U zW>wa#;zvuAJx|3_X zX=4-7gOQF+ce4?U3vIu+iB+f*prJuJ5NdIr}{{wnuWc zzdK@2uJ-pt?8(*sVQ2q6r-xkaA9MDPI(za)$MAH)8*+er{!{)mTav5)0cZcu&YoQT zZ*unEclP93ug%Wh`zKdDyPf@G&Of>8;en5Mf8gxN)&Ar(H&T0YweNTK|Kj|UtNy`Y zkMq}zx{(dYaXiL2tWzv((EgGyUDI^ef~X%1?Mqx^-r$zSbY$VzWQOlt87WGebo@L zCs+G<&i--dpZx!nc1AINo>_hVX4im$VevvJhV{Z1Fw}Itu0d`wV1&0AVWBA+Rz@<& zQYM=T*xHG0C6m^ba$!}z@I{b}l#7U3swI5k3k&%o7gps9O9Uwrxo{<`av^{L1E!eP zZPTvXy0qWHz+*o<9_cYI z(;}bcW>~n-g}nC-?sGYwh3!*$Jd`@7;O-0VeOt+(eJT$R z<^=9JfqPC?oBEYUedYx2e&OyH?tbC!_gLdodH66VaMy=>PEKSn&izN1qSCzJ;otE{ zj&Ye5dG7<<`vA8m-21Rr_M!Sz9v+-K+~*GWxvw|%E06k|JKX)k-7nnz!rkx5#;5Y| z;oRY_5BIrmW-!kEOXb|*;otFi?iiP8k@r5py$^7E!o3gY%05(|%EN&KKHkp z`jtn0&K>T4;qDjie&O!-eB)Dj_;BuU*N6Mu?`6aGxVQA3ql<$`;z z_GCWhZwzurt{lydKOXWeB6S(ID?m5}t)UQ11 zGbeEO3wOV8_X~Hw2O6Ks!-qM6yFT1=a;Thp{r5-k@b7p$cZ|!l$a^2)-Uqln;ogVC zWgn_f<>A4(!+q{>pZk%fe&tc0bBDWMxch~>U%2}{+W1r+KAbz;_2EAEV_84GKm2hN z$_4lLhZC8P?+-stczT6Lza5YG7?)|0_rAfsZ*cbo_r9%_eXBl|hX->4_ng2zC+ki9 z%A-DW0(ZY~_X~HwaQAz%@u@s~m=n0`!#yV(<=p=y3gv=_f5#&_#${UMy$^8j1Kgf) z@59-$57npg@Zj9xK6kj!eY2@wdDQ3J;qDjie&OyH?tafTK9z?L=MHy$xX=Bqa_+~L zqSCzJ;otE{j&Ye5dG7<<`vA8m-1~68>_hdbJUlpexX&H#bHC8kuRQ8=?r`@DcfWA= z3wOU48=uO_hdbJUlpe zxX&H#bAPv~UwPE$+~MvQ?tbC!7w H$Ihz59bbdeYns4YSw>Ys!@M^1rPs@$8*QH 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 CrOJ8$ literal 0 HcmV?d00001 diff --git a/drivers/net/can/ls_canfd/lscanfd_platform.ko b/drivers/net/can/ls_canfd/lscanfd_platform.ko new file mode 100644 index 0000000000000000000000000000000000000000..42fac74276911c0b08210bb089d29d66239cdbd6 GIT binary patch literal 27720 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 M_xi1t0dko9FJj#aKmY&$ literal 0 HcmV?d00001 diff --git a/drivers/spi/spi-ls-io.c b/drivers/spi/spi-ls-io.c index b378e6e1d..598218697 100644 --- a/drivers/spi/spi-ls-io.c +++ b/drivers/spi/spi-ls-io.c @@ -138,6 +138,8 @@ struct ls_spiio_priv { u32 ref_clk; u32 clk; u8 dsize; + struct gpio_desc **cs_gpios; + struct device *dev; }; static int ls_spiio_idle_sr1(struct ls_spiio_priv* priv, u32 bit) @@ -148,19 +150,90 @@ static int ls_spiio_idle_sr1(struct ls_spiio_priv* priv, u32 bit) return timeout; } -static int ls_spiio_set_cs(struct ls_spiio_priv* priv, int cs) +static int ls_spiio_active_cs(struct ls_spiio_priv* priv, int cs) { - ls_spiio_write_reg(priv, REG_CR1, - BIT_CR1_SSREV | BIT_CR1_SPE); + int active = 0; + + if (!priv->cs_gpios) + ls_spiio_write_reg(priv, REG_CR1, BIT_CR1_SSREV | BIT_CR1_SPE); + else + gpiod_set_raw_value(priv->cs_gpios[cs], active); + return 0; } static int ls_spiio_clear_cs(struct ls_spiio_priv* priv) { - ls_spiio_write_reg(priv, REG_CR1, BIT_CR1_SSREV); + struct spi_master* master = priv->master; + int clear = 1; + int i; + + if (!priv->cs_gpios) + ls_spiio_write_reg(priv, REG_CR1, BIT_CR1_SSREV); + else + for (i = 0; i < master->num_chipselect; i++) + gpiod_set_raw_value(priv->cs_gpios[i], clear); + return 0; } +static int ls_spiio_free_cs_gpios(struct ls_spiio_priv* priv) +{ + struct spi_master* master = priv->master; + struct device *dev = priv->dev; + int i; + + if (!priv->cs_gpios) + return 0; + + for (i = 0; i < master->num_chipselect; i++) + devm_gpiod_put(dev, priv->cs_gpios[i]); + + devm_kfree(dev, priv->cs_gpios); + + return 0; +} + +static int ls_spiio_init_cs_gpios(struct ls_spiio_priv* priv) +{ + struct spi_master* master = priv->master; + struct device *dev = priv->dev; + int clear = 1; + int ret; + int i; + + priv->cs_gpios = devm_kcalloc(dev, master->num_chipselect, + sizeof(*priv->cs_gpios), + GFP_KERNEL); + if (!priv->cs_gpios) + return -ENOMEM; + + for (i = 0; i < master->num_chipselect; i++) { + priv->cs_gpios[i] = devm_gpiod_get_index(dev, "cs", i, + GPIOD_OUT_HIGH); + if (IS_ERR(priv->cs_gpios[i])) + { + ret = PTR_ERR(priv->cs_gpios[i]); + dev_err(dev, "Cannot Requst cs-gpio[%d]: %d\n", + i, ret); + goto free_cs_gpio_array; + } + else + { + dev_info(dev, "GPIO[%d] as cs[%d]\n", + desc_to_gpio(priv->cs_gpios[i]), i); + gpiod_direction_output_raw(priv->cs_gpios[i], clear); + } + } + + return 0; + +free_cs_gpio_array: + devm_kfree(dev, priv->cs_gpios); + + return ret; +} + static int ls_spiio_xfer(struct ls_spiio_priv* priv, u8* tx, u8* rx, int len) { int remain = len; @@ -294,7 +367,7 @@ static int __spi_transfer(struct spi_device *spi, struct spi_message *m) m->actual_length = 0; m->status = 0; - ls_spiio_set_cs(priv, spi->chip_select); + ls_spiio_active_cs(priv, spi->chip_select); list_for_each_entry(t, &m->transfers, transfer_list) { /*setup spi clock*/ ls_spiio_set_clk_timing(priv, t->speed_hz, spi->mode); @@ -310,8 +383,10 @@ static int __spi_transfer(struct spi_device *spi, struct spi_message *m) static int drv_ls_spiio_probe(struct platform_device *pdev) { + struct device *dev = &pdev->dev; struct ls_spiio_priv* priv; struct spi_master* master; + u32 num_chipselect; int ret; master = spi_alloc_master(&pdev->dev, sizeof(*priv)); @@ -328,30 +403,45 @@ static int drv_ls_spiio_probe(struct platform_device *pdev) master->mode_bits = SPI_CPOL | SPI_CPHA | SPI_LSB_FIRST; master->setup = __spi_setup; master->transfer = __spi_transfer; - master->num_chipselect = 1; + + if (of_property_read_u32(pdev->dev.of_node, "num-chipselects", + &num_chipselect)) + num_chipselect = 1; + master->num_chipselect = num_chipselect ? num_chipselect : 1; + #ifdef CONFIG_OF master->dev.of_node = of_node_get(pdev->dev.of_node); #endif dev_set_drvdata(&pdev->dev, master); priv = spi_master_get_devdata(master); + priv->master = master; + priv->dev = dev; + + if (of_find_property(pdev->dev.of_node, "cs-gpios", NULL)) + { + ret = ls_spiio_init_cs_gpios(priv); + if (ret) + goto free_master; + } + priv->reg = devm_platform_ioremap_resource(pdev, 0); if (priv->reg == NULL) { dev_err(&pdev->dev, "Cannot map IO\n"); ret = -ENXIO; + goto try_free_cs_gpios; } if (of_property_read_u32(pdev->dev.of_node, "clock-frequency", &priv->ref_clk)) { dev_err(&pdev->dev, "Cannot get clock\n"); - goto free_master; + goto try_free_cs_gpios; } - priv->master = master; ls_spiio_init(priv); ret = spi_register_master(master); - if (ret < 0) + if (ret) { dev_err(&pdev->dev, "spi register fail\n"); goto unmap_io; @@ -361,6 +451,9 @@ static int drv_ls_spiio_probe(struct platform_device *pdev) unmap_io: devm_iounmap(&pdev->dev, priv->reg); +try_free_cs_gpios: + if (of_find_property(pdev->dev.of_node, "cs-gpios", NULL)) + ls_spiio_free_cs_gpios(priv); free_master: spi_master_put(master); err: diff --git a/drivers/staging/rtl8188fu/include/rtw_debug.h b/drivers/staging/rtl8188fu/include/rtw_debug.h index d96dca25c..335b2842f 100644 --- a/drivers/staging/rtl8188fu/include/rtw_debug.h +++ b/drivers/staging/rtl8188fu/include/rtw_debug.h @@ -195,7 +195,7 @@ extern void rtl871x_cedbg(const char *fmt, ...); #define DRIVER_PREFIX "RTL871X: " #if defined(_dbgdump) - +#ifdef CONFIG_DEBUG_RTL871X #define DBG_871X_EXP(level, EXP) do { if (level <= GlobalDebugLevel) EXP; } while (0) /* with driver-defined prefix */ @@ -221,7 +221,13 @@ extern void rtl871x_cedbg(const char *fmt, ...); _dbgdump(fmt, ##arg);\ }\ }while(0) - +#else +#define DBG_871X_EXP(level, EXP) do { } while (0) +#undef DBG_871X_LEVEL +#define DBG_871X_LEVEL(level, fmt, arg...) do { } while (0) +#undef _DBG_871X_LEVEL +#define _DBG_871X_LEVEL(level, fmt, arg...) do { } while (0) +#endif #if defined(_seqdump) #define RTW_DBGDUMP 0 /* 'stream' for _dbgdump */ diff --git a/drivers/staging/rtl8188fu/os_dep/linux/usb_intf.c b/drivers/staging/rtl8188fu/os_dep/linux/usb_intf.c index 72d9e16cd..cdec4ade2 100644 --- a/drivers/staging/rtl8188fu/os_dep/linux/usb_intf.c +++ b/drivers/staging/rtl8188fu/os_dep/linux/usb_intf.c @@ -1521,11 +1521,13 @@ int rockchip_wifi_init_module(void) int type = get_wifi_chip_type(); if (type < WIFI_AP6XXX_SERIES || type == WIFI_ESP8089) return 0; #endif +#ifdef CONFIG_DEBUG_RTL871X printk("\n"); printk("=======================================================\n"); printk("==== Launching Wi-Fi driver! (Powered by Rockchip) ====\n"); printk("=======================================================\n"); printk("Realtek 8188FU USB WiFi driver (Powered by Rockchip) init.\n"); +#endif #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)) #if 0 rockchip_wifi_power(1); @@ -1548,11 +1550,13 @@ void rockchip_wifi_exit_module(void) int type = get_wifi_chip_type(); if (type < WIFI_AP6XXX_SERIES || type == WIFI_ESP8089) return; #endif +#ifdef CONFIG_DEBUG_RTL871X printk("\n"); printk("=======================================================\n"); printk("==== Dislaunching Wi-Fi driver! (Powered by Rockchip) ====\n"); printk("=======================================================\n"); printk("Realtek 8188FU USB WiFi driver (Powered by Rockchip) init.\n"); +#endif rtw_drv_halt(); #if (LINUX_VERSION_CODE >= KERNEL_VERSION(3, 1, 0)) //rockchip_wifi_set_carddetect(0); diff --git a/scripts/mkcompile_h b/scripts/mkcompile_h index 4ae735039..927c71658 100755 --- a/scripts/mkcompile_h +++ b/scripts/mkcompile_h @@ -46,6 +46,12 @@ if [ -n "$SMP" ] ; then CONFIG_FLAGS="SMP"; fi if [ -n "$PREEMPT" ] ; then CONFIG_FLAGS="$CONFIG_FLAGS PREEMPT"; fi if [ -n "$PREEMPT_RT" ] ; then CONFIG_FLAGS="$CONFIG_FLAGS PREEMPT_RT"; fi +if [ -f "kernel_git_info" ]; then + CONFIG_FLAGS="$CONFIG_FLAGS g"$(cat kernel_git_info) +elif [ -d ".git" ]; then + CONFIG_FLAGS="$CONFIG_FLAGS g"$(git rev-parse --short HEAD) +fi + # Truncate to maximum length UTS_LEN=64 UTS_VERSION="$(echo $UTS_VERSION $CONFIG_FLAGS $TIMESTAMP | cut -b -$UTS_LEN)"