summaryrefslogtreecommitdiff
path: root/drivers/pinctrl
diff options
context:
space:
mode:
authorJianlong Huang <jianlong.huang@starfivetech.com>2023-02-09 22:37:02 +0800
committerLinus Walleij <linus.walleij@linaro.org>2023-02-10 23:44:07 +0100
commitb1170c42141a71e07f9cf5976ecf71323cfcec32 (patch)
tree5b68abd999c63188b8ee7c243fe14cd4ef7b8b9a /drivers/pinctrl
parent447976ab62c5dd6016f06a2f24798407398b5c07 (diff)
downloadlinux-b1170c42141a71e07f9cf5976ecf71323cfcec32.tar.gz
linux-b1170c42141a71e07f9cf5976ecf71323cfcec32.tar.bz2
linux-b1170c42141a71e07f9cf5976ecf71323cfcec32.zip
pinctrl: starfive: Add StarFive JH7110 aon controller driver
Add pinctrl driver for StarFive JH7110 SoC aon pinctrl controller. Co-developed-by: Emil Renner Berthing <kernel@esmil.dk> Signed-off-by: Emil Renner Berthing <kernel@esmil.dk> Signed-off-by: Jianlong Huang <jianlong.huang@starfivetech.com> Signed-off-by: Hal Feng <hal.feng@starfivetech.com> Link: https://lore.kernel.org/r/20230209143702.44408-5-hal.feng@starfivetech.com Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
Diffstat (limited to 'drivers/pinctrl')
-rw-r--r--drivers/pinctrl/starfive/Kconfig12
-rw-r--r--drivers/pinctrl/starfive/Makefile1
-rw-r--r--drivers/pinctrl/starfive/pinctrl-starfive-jh7110-aon.c177
3 files changed, 190 insertions, 0 deletions
diff --git a/drivers/pinctrl/starfive/Kconfig b/drivers/pinctrl/starfive/Kconfig
index 453c8a0b3118..8192ac2087fc 100644
--- a/drivers/pinctrl/starfive/Kconfig
+++ b/drivers/pinctrl/starfive/Kconfig
@@ -37,3 +37,15 @@ config PINCTRL_STARFIVE_JH7110_SYS
This also provides an interface to the GPIO pins not used by other
peripherals supporting inputs, outputs, configuring pull-up/pull-down
and interrupts on input changes.
+
+config PINCTRL_STARFIVE_JH7110_AON
+ tristate "Always-on pinctrl and GPIO driver for the StarFive JH7110 SoC"
+ depends on SOC_STARFIVE || COMPILE_TEST
+ depends on OF
+ select PINCTRL_STARFIVE_JH7110
+ default SOC_STARFIVE
+ help
+ Say yes here to support always-on pin control on the StarFive JH7110 SoC.
+ This also provides an interface to the GPIO pins not used by other
+ peripherals supporting inputs, outputs, configuring pull-up/pull-down
+ and interrupts on input changes.
diff --git a/drivers/pinctrl/starfive/Makefile b/drivers/pinctrl/starfive/Makefile
index dc2d1e392314..ee0d32d085cb 100644
--- a/drivers/pinctrl/starfive/Makefile
+++ b/drivers/pinctrl/starfive/Makefile
@@ -4,3 +4,4 @@ obj-$(CONFIG_PINCTRL_STARFIVE_JH7100) += pinctrl-starfive-jh7100.o
obj-$(CONFIG_PINCTRL_STARFIVE_JH7110) += pinctrl-starfive-jh7110.o
obj-$(CONFIG_PINCTRL_STARFIVE_JH7110_SYS) += pinctrl-starfive-jh7110-sys.o
+obj-$(CONFIG_PINCTRL_STARFIVE_JH7110_AON) += pinctrl-starfive-jh7110-aon.o
diff --git a/drivers/pinctrl/starfive/pinctrl-starfive-jh7110-aon.c b/drivers/pinctrl/starfive/pinctrl-starfive-jh7110-aon.c
new file mode 100644
index 000000000000..8cf28aaed254
--- /dev/null
+++ b/drivers/pinctrl/starfive/pinctrl-starfive-jh7110-aon.c
@@ -0,0 +1,177 @@
+// SPDX-License-Identifier: GPL-2.0
+/*
+ * Pinctrl / GPIO driver for StarFive JH7110 SoC aon controller
+ *
+ * Copyright (C) 2022 StarFive Technology Co., Ltd.
+ */
+
+#include <linux/err.h>
+#include <linux/gpio/driver.h>
+#include <linux/init.h>
+#include <linux/interrupt.h>
+#include <linux/io.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/of_device.h>
+#include <linux/of_irq.h>
+#include <linux/of_platform.h>
+#include <linux/pinctrl/pinconf.h>
+#include <linux/pinctrl/pinconf-generic.h>
+#include <linux/pinctrl/pinctrl.h>
+#include <linux/pinctrl/pinmux.h>
+#include <linux/platform_device.h>
+#include <linux/pm_runtime.h>
+#include <linux/regmap.h>
+#include <linux/slab.h>
+
+#include <dt-bindings/pinctrl/starfive,jh7110-pinctrl.h>
+
+#include "../core.h"
+#include "../pinconf.h"
+#include "../pinmux.h"
+#include "pinctrl-starfive-jh7110.h"
+
+#define JH7110_AON_NGPIO 4
+#define JH7110_AON_GC_BASE 64
+
+/* registers */
+#define JH7110_AON_DOEN 0x0
+#define JH7110_AON_DOUT 0x4
+#define JH7110_AON_GPI 0x8
+#define JH7110_AON_GPIOIN 0x2c
+
+#define JH7110_AON_GPIOEN 0xc
+#define JH7110_AON_GPIOIS 0x10
+#define JH7110_AON_GPIOIC 0x14
+#define JH7110_AON_GPIOIBE 0x18
+#define JH7110_AON_GPIOIEV 0x1c
+#define JH7110_AON_GPIOIE 0x20
+#define JH7110_AON_GPIORIS 0x28
+#define JH7110_AON_GPIOMIS 0x28
+
+#define JH7110_AON_GPO_PDA_0_5_CFG 0x30
+
+static const struct pinctrl_pin_desc jh7110_aon_pins[] = {
+ PINCTRL_PIN(PAD_TESTEN, "TESTEN"),
+ PINCTRL_PIN(PAD_RGPIO0, "RGPIO0"),
+ PINCTRL_PIN(PAD_RGPIO1, "RGPIO1"),
+ PINCTRL_PIN(PAD_RGPIO2, "RGPIO2"),
+ PINCTRL_PIN(PAD_RGPIO3, "RGPIO3"),
+ PINCTRL_PIN(PAD_RSTN, "RSTN"),
+ PINCTRL_PIN(PAD_GMAC0_MDC, "GMAC0_MDC"),
+ PINCTRL_PIN(PAD_GMAC0_MDIO, "GMAC0_MDIO"),
+ PINCTRL_PIN(PAD_GMAC0_RXD0, "GMAC0_RXD0"),
+ PINCTRL_PIN(PAD_GMAC0_RXD1, "GMAC0_RXD1"),
+ PINCTRL_PIN(PAD_GMAC0_RXD2, "GMAC0_RXD2"),
+ PINCTRL_PIN(PAD_GMAC0_RXD3, "GMAC0_RXD3"),
+ PINCTRL_PIN(PAD_GMAC0_RXDV, "GMAC0_RXDV"),
+ PINCTRL_PIN(PAD_GMAC0_RXC, "GMAC0_RXC"),
+ PINCTRL_PIN(PAD_GMAC0_TXD0, "GMAC0_TXD0"),
+ PINCTRL_PIN(PAD_GMAC0_TXD1, "GMAC0_TXD1"),
+ PINCTRL_PIN(PAD_GMAC0_TXD2, "GMAC0_TXD2"),
+ PINCTRL_PIN(PAD_GMAC0_TXD3, "GMAC0_TXD3"),
+ PINCTRL_PIN(PAD_GMAC0_TXEN, "GMAC0_TXEN"),
+ PINCTRL_PIN(PAD_GMAC0_TXC, "GMAC0_TXC"),
+};
+
+static int jh7110_aon_set_one_pin_mux(struct jh7110_pinctrl *sfp,
+ unsigned int pin,
+ unsigned int din, u32 dout,
+ u32 doen, u32 func)
+{
+ if (pin < sfp->gc.ngpio && func == 0)
+ jh7110_set_gpiomux(sfp, pin, din, dout, doen);
+
+ return 0;
+}
+
+static int jh7110_aon_get_padcfg_base(struct jh7110_pinctrl *sfp,
+ unsigned int pin)
+{
+ if (pin < PAD_GMAC0_MDC)
+ return JH7110_AON_GPO_PDA_0_5_CFG;
+
+ return -1;
+}
+
+static void jh7110_aon_irq_handler(struct irq_desc *desc)
+{
+ struct jh7110_pinctrl *sfp = jh7110_from_irq_desc(desc);
+ struct irq_chip *chip = irq_desc_get_chip(desc);
+ unsigned long mis;
+ unsigned int pin;
+
+ chained_irq_enter(chip, desc);
+
+ mis = readl_relaxed(sfp->base + JH7110_AON_GPIOMIS);
+ for_each_set_bit(pin, &mis, JH7110_AON_NGPIO)
+ generic_handle_domain_irq(sfp->gc.irq.domain, pin);
+
+ chained_irq_exit(chip, desc);
+}
+
+static int jh7110_aon_init_hw(struct gpio_chip *gc)
+{
+ struct jh7110_pinctrl *sfp = container_of(gc,
+ struct jh7110_pinctrl, gc);
+
+ /* mask all GPIO interrupts */
+ writel_relaxed(0, sfp->base + JH7110_AON_GPIOIE);
+ /* clear edge interrupt flags */
+ writel_relaxed(0, sfp->base + JH7110_AON_GPIOIC);
+ writel_relaxed(0x0f, sfp->base + JH7110_AON_GPIOIC);
+ /* enable GPIO interrupts */
+ writel_relaxed(1, sfp->base + JH7110_AON_GPIOEN);
+ return 0;
+}
+
+static const struct jh7110_gpio_irq_reg jh7110_aon_irq_reg = {
+ .is_reg_base = JH7110_AON_GPIOIS,
+ .ic_reg_base = JH7110_AON_GPIOIC,
+ .ibe_reg_base = JH7110_AON_GPIOIBE,
+ .iev_reg_base = JH7110_AON_GPIOIEV,
+ .ie_reg_base = JH7110_AON_GPIOIE,
+ .ris_reg_base = JH7110_AON_GPIORIS,
+ .mis_reg_base = JH7110_AON_GPIOMIS,
+};
+
+static const struct jh7110_pinctrl_soc_info jh7110_aon_pinctrl_info = {
+ .pins = jh7110_aon_pins,
+ .npins = ARRAY_SIZE(jh7110_aon_pins),
+ .ngpios = JH7110_AON_NGPIO,
+ .gc_base = JH7110_AON_GC_BASE,
+ .dout_reg_base = JH7110_AON_DOUT,
+ .dout_mask = GENMASK(3, 0),
+ .doen_reg_base = JH7110_AON_DOEN,
+ .doen_mask = GENMASK(2, 0),
+ .gpi_reg_base = JH7110_AON_GPI,
+ .gpi_mask = GENMASK(3, 0),
+ .gpioin_reg_base = JH7110_AON_GPIOIN,
+ .irq_reg = &jh7110_aon_irq_reg,
+ .jh7110_set_one_pin_mux = jh7110_aon_set_one_pin_mux,
+ .jh7110_get_padcfg_base = jh7110_aon_get_padcfg_base,
+ .jh7110_gpio_irq_handler = jh7110_aon_irq_handler,
+ .jh7110_gpio_init_hw = jh7110_aon_init_hw,
+};
+
+static const struct of_device_id jh7110_aon_pinctrl_of_match[] = {
+ {
+ .compatible = "starfive,jh7110-aon-pinctrl",
+ .data = &jh7110_aon_pinctrl_info,
+ },
+ { /* sentinel */ }
+};
+MODULE_DEVICE_TABLE(of, jh7110_aon_pinctrl_of_match);
+
+static struct platform_driver jh7110_aon_pinctrl_driver = {
+ .probe = jh7110_pinctrl_probe,
+ .driver = {
+ .name = "starfive-jh7110-aon-pinctrl",
+ .of_match_table = jh7110_aon_pinctrl_of_match,
+ },
+};
+module_platform_driver(jh7110_aon_pinctrl_driver);
+
+MODULE_DESCRIPTION("Pinctrl driver for the StarFive JH7110 SoC aon controller");
+MODULE_AUTHOR("Jianlong Huang <jianlong.huang@starfivetech.com>");
+MODULE_LICENSE("GPL");
))2&QP@Vtl倪!0x. Ulq>[%rG7";9 Z\8,僟ZSWN8]Kݛ2Z}nZ|3lsW}HAZ/^د|q7W* K-dYAa.X:Wŭ޻*҆t{!v,!Wnzί6M9J[r]={_иbvG ۪k.h1+*̕ zy쮺<]|bwŐ{.v縫Ug KcbR[ J[Yudh批I[#b\zevlcg*5zf':1[Jn,"9dVBEGFTSW5e'49s% }Eaz< YM bm?dqfi*(r}]g?PF݋aN^4q̫lxj!l -5Zzo3DAb *վ7oBFS|GݳVcF,ޚmV:Rr2nj $V5{JVWsqjDtŹCBb;\aQz..9{,U}zK!;AS7TEPEI*fRq *nK"NZT6O9}ۿtS`gP붭蒎4O&I=yb'HFsu^j ;/fLck^bYP4ۘiQp8wxXX!nUZmiz5PCOFܐi*'SUvIJ}&NgM(efDWbqْ>OU͝]ƖW*ZCm?syyWnX,]v~5BwA9)J_3ƴK檰ZM^}LЦ ͣ'*. ߁W3lH5N:+XвT:el: ɿ_råa1D͓;:#WD3a@)h-J7\))a_Mz*? ,fhW[fe9h9&*b}sC o`^2TEQE=0?`}nd3ɪy<7,O9DTMG,.s_><+bZB1lxG]PL %Q29A!3CCybh1.h 6YFqצמ`m:'R92L7{ U323cõ cRy ŸIǦhfh?|5K[jrX`#Zޥ$: `@^N8o`G꫱n \"q;Y1~7W_rGŃ8i\ VRqG, ^wjv pqvtG'ot3a^ ~>ג#Y콽3_% _?l}_,܇6KE*꟢W߳/.:N ڣ6ܞ#mגye5LuQﻨ'ƣ{s>f.g{y>Sadb"GнR|<nOg;Էi$=Xbh:P *^:+\LѺX?r?fe7HIsQMypIƪN_EdlHȹ5"-' Z- QU&?pc]c*l~)^wwEXD`oOʶm3˨15LZλDvYFD3瓾Q'8lCi%^8x ]]/7(ߢ sܽeh::s;n_HۿF8paCZWmWgUZQ%%q9DwIܠ7x.kY }Zlm@$drFyon&Ŭh'7ҩR!LЁn L:V`XLR@~ s.'[;kFlAI,B[{Z 1:ӽPU:#f|KBؓtᡆУvC|)L=Y7 U"h/ MxZȫo@UZ/,Q j*8 ]1a[Xv Zk-SIn'ssm iD>d<B ?UlpL1Ă qu4CHµ|Alb=fh2$\O58۵:} b~oj+휷kWwT]!qb (-y=׸YoVXǻWym;A0^>H5SWhHmv08iOCBUc嚻qt*=@'e\ r+0u9?`rWͳyW*GR(Rهq[-(T(ªITb3u,J1XVV{h:Q(%Oɓ]wd7rLGe8Ma֭RsB ;t 5/ͬD6[G Zy4* [a<gg |!Υ(A M=`'͈'c7^:\;!%=\y酊T h24 \÷U4&*S-!?xY-D6VǾ@x";/\`FpT3_xc35OΝAr0Im9^>%͑4F5qkbq *ͻf걸NCDLKJ ~z' ϼ*z6 iK߬OL7k#3tc+ROKT]#UeNI%Dӥ>ʬD5{iԿðᇒr돷o8(G3ɞwFiir|#Uݘ)֊uΩ%ӵS8$:@]@AUBDDZh{-l{j+f ꏜHkmMvxoxG2媛d=y{_aGz*9݈-ja|!0'a43 YSY* tgWWZ Zs$5GMm߲߉ql^4q{г.tvwذQTمLhDb?yb~,߻ n_Aַ̹լn (nrA#jʶ:i>͂&| w/S1 #HD}$~=~|#qWt+tIVs1G*,L:RAa8:"+n}Sܫzo⻓Hل&ơ|^=XfU0U+Tʷ1;VH2%yqD ƈvD{ë{`r3F0O\laDZߵkfJ,Ԛ8G[CcQߕm6lN?cڽO+ `2d{Q>Xhfwyl ,rpu 0堲fiR =mS MMKē0k` q@0mɒϧNyu[e~~;: _W|,߿xˌۧ*;*z=KZ%'QLlgcRj!3'`[CI`E1NX+TWeA*oۯdwo ùtgc`9^9Ei"Ys^3 +t]xvmΨP_G\\nCò ~c?ht~H5a>uJ&$.{c&m;k^a6(iid"Zٳ3׋gz-UE9QY.l&纊T|?rgֽF~.CcɝS)>BhM 4>BLXpHkDEmw4g<>˚D mJL;v}dLkl$Z 魦iƃY+KJR[s{>+u9mzCǩ=8tLXY7ѷ $/,Ԯcd:Ü>Ac]5u&IC޿JɕW,hAY\'%4~41MIouy]z F#dMuTjX\p:6@~l<|&g㲷 wl< ˩RwyE_w߳0ؗL"1~]QC0FtNP !%^Qa 벭Om}aϗJb)VZo4̽;t9kUB,nW^Vt'SOѪ^y W,%{rga.xIOz;d||i v[{HIP f5~13]:]ŧ'3SdUc=NfL>`^0`ѕV#Xh:ݔцzGqWɏ,E[Ak=__,UO=}=5. )u 0]J/aJOOoQTg;#;&`I"6>d] vWX=&*Kww= 7O7*zAn.(> 2O7WIe9KۼVF©ϴ8 2Gr{dvBgMNp YFg5Y>osAp2$,<E%?U LY=]5f6@/= |,91'~onNN.菸Mc:CGBj!(W7M-sXJT9G/4͊,E^6#m!ݯXC7IvO (~GʫUPfH%e7i6l!JJ=ec־ !*W=ߟSj]Lڪi'Jz *ɧ yTՑ흯KVP @X?@w|MP3}0$-lW8 wM?p*ʖN ,:MO^c4J@^o^3g~/ך&LM%4bRiH>42ʹRL 9QTAH_O3QD~̋y<{:U#Mso_d7NXbJG"&'%۽9tɣnǕ_ިsE"300'=$-_5b m| 텲TrT=z]骩AUYG\5ȻAH!e>=vE_&gɭuӱש+W<Wӱ뽹x?f][9GW.?;kjVפ>PeHa6]|9گ\%K^_|e7 p[k]ss2,ZF"5ZpǭuP;,ϻo|78C:* f2ˎv=W[uu{7͗ Liߓ!{K osVۨq}5ZZOTr| Wk?Wu-B, cz4-5Fǃ5ʏ,|0JF{5TlzF 1}?_u}>&|n>G2/i.wRySXOT9w] $Ai=+k2,F1z':_T7acQҽ{Uߵ̓J^}F= ]8>980 LXX۔4Q ݔ߾MC-kǘiMvB (n/ +w[VIB&ay3\)6K2v ֚M#VUc ڇc "z(㠀5*Mx=﷥~[!=A#ZgQ+w+>2Pʥq28jY4ڹєIIlKc{r[>U5^P#֐Nk4 -q/s#@YN/IqZI@aJ-~_')HE% xMZ4@-,4 ȏqC2g1h>9k׵R8;62õ&u:]7tn9zDA&bn%Iyzy\R@p~^w)c(Z]UH.\r_Ǯ5V;ifQLrd@rT܍b"ϽMsO< ;& _'cO]OR-}SS[2X Zt%'8ejVQ3_%mc!Ŏ}@)> ~9}㟡w2]zsjU~*j%u5dT)5w-商ܺ÷-VwTv,G?^ҧ푃qSmQz"WݪNH9Xu*SIH}EpJ;*:SÐN$% wlqajmʽ;|s%? H 3_~2ɿudh@7ϵa!}jzumvgA޹u{}%c2am`O]Q!P go{KH:u&\> v:\f9t:|<j*3AH_^W}KhIw-; Ne$‘@[V8N\gP)[zjEvUQ޹H.ׂas2%Gd/ =|^YE۵ІSy$ tA(_+쁱*4Hn92&809XT$o2iPU.ӵ_Sog-ЩQ$D%"y.$6 o{7p/y`-ꜳ8>},twm+DiTU6a̽Ç[3Mr} ?g ALy.Kz~/yˆe9gp&cpԖ~81%&҈U!?'|WӣfK:<2wUSfR%&˜`^P)`Q3wqM5H7a?NN|DBlH0J'BNcoSw҃[^Mgmx|%(r8|p1QttzRZV _=Afa=p1\(:M3fO s(uF.%)8HW}}z2 k۬~Hk%E aR<~9{!೬maz[ M N 8g:w|?Y@%ekڳsͪ>=gUtg *C@+uCEoͥ*+[Tkp[j1댫b}z1gҐPHe*Kedic7=Kg]$F{gG^K Chv ʎw!imkR} vnF ?_o5] E=.9q]Ew=3l)47P/plBDu"CݺDpC5 VqY oxjjo۰nMa97y@~[wCK:3 *4`e.^INZŸl5)'jjpp}Uԣ+!s(B0qhG]RKC~y>Y\BGS\ 3D) wg {Z!2*+"Soʶ 0-~$[)I>XN1\U/H̩Gϓ?Cі'M49niFTT'*H$AÙby^\7:b }E쀌D6-L96?ơ 7DP' Yh2cu>-rt'7 tEq<{cx܁rd,>'~AA L`/x1U+}9--';f#ҬfmQQT}t%} #H<# 7}>քOo^=Guve[M̞ag|z㱂<0py Kkb>nurЖ㞗9DKQN;م {!= )}pz4K`bOMܷpXv{QΎ\ *ߙ]7^=f \ U{BoN)qW̊(pe~QRp^dsى~S}?j*s1R\qosClZ%6@ֿW' xtkt٬P+ӁF;؛*Ez0d9}>5+uax5Cg_'IY} .SwS?Vc>s9;~Mz$PXLXM̦5+*y\Ppeʱ)䐡Zn"rK\TO2RoHӖ'Ԣ 8A٫>[ݜup|b13%n~rtڏJR j;/ƕ۴7AB oku(m6Y>^  _uA|EC`os2g OUs_yQ^ODfu2NwxXqFeXL3ºE$,ۦ"1`+C|t|?V\5\bt5f"!ɈOD VyqSsl'Vq#'#3ql',?&Ӹ//78Ȍ`}mQY-eOZOX+e67Z3M"yB@DA9eΆ-Y*~Wnr;]^ofǫ,\m}ݽg^Z{ˌ<] ߅pͧe>m轌Nv4.<*ϥsp`b)sTؖ5oDz"Tы%EJW|&Yy[k;LW@SwT7vfVfHkbѶ*L&TCGM^#"%`BM.JSC Kn%YZe/h[M^5#S }37^\wǶr`" GEyd@hf0 # f WHc^[SURQDuֆlU43}dE]\`M0h,y'ouiVY_-Ѕö~ w3aW&|q8̻`Sj=ڑW8<3)uĢn0^_F[5mg;K.do_( GŝH1kԷ9e-+[\"-MOԙ/spfF_GڣDTIt7I\o\Ej+;5~TSMpw'qt.*T&zH7k44y|K6h,#'™ @*&͌ $IOW{ #c`ldK;P!-#J tƽ XMpj| wm !Y$zO23;"ȧ(0U.9 /'BnA^"L76s+˖;^SZ 0Hπ'rKE\TsK J︹~B27TTx2- pK󜊫s[J}~h94#&ؔ|UKӰ|ZG%lb78bFXȪag~ȌiJdƕ; Y[maWhh癩jߙǕw|qWКQ}ቺ>pnč6Po}Z)TU+SjGh:C=x mRRy֏媽D~v2,&^8NV4;S_[_xlg3ZYFk(yk_mLbaFU9VI5eC0浉8婡Y-ru1?3%G/Max~g7N`.RX,B[LP M< ju}ӵ*{݉qC}TBknڄőSy ce<_I?Ŏ>@Dn0LH%o!5r}GQ-Dq/VIjr2m*ǭ^Lcka$33)aIc/74mnEn鏩#1$ $PuF6b274Æde)/Yrݱ~L ?ݐI/mk+dfN^jg j'q`X-|XY<ޫ,[ɒ$)H[!o;eƸ: CneK<@0Дe |5NS\ 7A[Y/W)p #}TO%s*4%Twk{´Uwt\[{D@BF(r1DsJZ`fTpP\ 4 HTë6ܠ1\zZc뒭ALe_˒EZW=KG#,{s0~t_D/mO82(s msq޵Xt"9v +f>‡v;m; tE[,U8DM-iw8x6re[Tkd,V*tluq>'١Nsgʯv _-Ѿ(,8>*%~Yl_V"m[)tڕDgc(NGV^>q*\]TFN*=Uj{Z:F*C[\6/ECUl!VK9kt[Y?Wڌa,-M NnڑLUv'4=,6G?@o}չYt=㙕ǽ!W<(m _Qj"]Um8eUFU/^s@ U1>NOOoXNkȊ!AH%o:Q\*0}Ir-LeȌSGmև_l۹s#yS`LMxSA ֙xauqVa23Jq: &Ġߞ2!Pa {#x@t/Zj*UmjkrI^iVTإO]5l~BǂbF zu;zuU5T`4֐^.r9TEW7 r/z3sQH;9/,%.YjpF|9_uy:oY 3bK\<L4Cc~֬w۬SKnw?͉4p>݊cyx$♫worˋWǛ&A(AArhLk)&َp*5=x=Ed&](\M5bp`j>O`&{>0iųNb;lЬђ6k9< $FVvЮQH:L=:ity+Ѽ3ncx$.ՇTE5Ljff@dX!UqPg̸sSJue @/φ|,LMNW5%ѯuCRQBݎ]72*~b(>~X`,'>#?,G8Uc}u+3Vٳ`U_ d磚nM"#Bd ;xNÓ6O0]_ڋKl Y1ذ5ǥݨ<6:;yvBH 0/k^~rq¸g(}{.Sso fr 6dYOT!׶-b649Hkq#iQ27g{˻@.rIb< 2b5=lxٮ:+J'J\SQDy봅(~@'=Hc3WIQA$.~X;HI\|*2H5ZY؍Cףz\A^׹OnrV}ϋG֒sZzpe9ڂ6q m/#v쌼9Qop 8He71?y(9C@Y\]58ѠuKqxM eprztusxL3OZTry2V|؂.#6;&ژ0*o9cPv]֊!z d{Be8'gB]SIOzw]qUܳ7L:t:XCcs0 h q#+A24wg^C*(Wwŏ5h43>lmD'SU+B"6˪oxFăh2PIxSn>YƐDKV3]s#)E' e|Lab>?\̑#)v)O#\+%BP%ߗ7ߺP￞Rk82_Ѻ˾y?WңALy;mwM1CbN$$BYG\ Rp"h9u+n+:oC&Cc܂FHm} 8 X4$Ê- 䓑?WUz@o2-> ]&P?F}*Ovx QB}PԦ f}7;!6ߤe&G?=c]o'00NJ+VҏzVsA!Y&" ̢[Wʮ)wdI[ecM<ֳ~W]ʝ1L$;J|Oj`n-1s6i/帹vݻ raJg[8["(ڣ[V8%VAc%MC\s_)o3;LgnsӖzsG^wo>B""df.ZFJUge&=-YW /voX 9 CHޗ!X}X^<|9 "MYʧߤЫ㉩#Ki5+XCYؤV{Gl!ks[wO=Bec#rQŋYuN%ܪ(թӛ2**ΎE `E'-aT{q֜v->|3 K}'Z#QTGMrW(9?%%JRFrz ϔraХvAHkNk/6/XjޝxxW3`ml>sn~oKnՎ=9bOQe$S^_1g~NC ] ˘|oঋ%+\LsnJԊud2_ c(gYW%]h}⩱j+mpd{Ҥ];cVs`Uslf ^Q  Ls"SiO/+++b̪Gs;EL3fx0v :NXߺۆMU "I/y#;U{wdOxW19 {`B Ꙏ~M:oR0{ͣ.>3 ng"Ym,$z]Xq ;kQiۘp4tr-j31fܡgDRh`48G<͚"7Go~N5jm3drݡ}$ #X !͜]HOd- n,ػ`<k Pqqi<֝ H ܙ&hFDK$tIЉ(ݻ1! >6P٪8ժR- էʷ=;ActN誱^b)woq eˮO71]S6oh\Eh\o# 0b3 b`839m+ YQUu$JC9@$㑇6PE#YСv X'|ټ;F3Τ(Cgf{|~ϧ이8Z퓞*wսFbÜC;D%}TY?x#& }nx{2ck;A4ߢ FDHɀq:85c0Pb9w|nh98q ~Z;Az{bBu"z9!{)gn\}\G<PN<,(0X@aބH%z ZinC@c"d8 GBatG-zԸj0AKbN9V8Ƅ`j7N2XTB (yև"ux\f~i\y 8PX =Q9lb')HֵOCH2@"9@u|8; ptNԪ, F¡P L;062IGr6dsyQ"'/FM5X֜wηTWCk5 `r8*%. ]ۊʴv9\xC)\穎%Ra[i;ߺ;P#lszClu R_OgC$v8 irG.d5%&HI@~DS8nCЀB ˊ֐^{prm?x:AiŒw pC`*HgFFurǖkֻWb O\_óT[ܫlDr-Ƥf fX#wq6{6D킧7öAАS=q7߭hP"A,}y+fQlv1 P-5hfg\@X6%hYq9;~t-ICF^D*@gb5뙥x% `dKn!sBM '~.HH(wH. 峫a ö$\&>)l0.P0}oJyle[qyOLX8u0e oºvB<=^x+zDEol0c~V.=&!棓nD \ČU nB!R}fz1ΜXNXPFO YÀX@/4""lְAr}SWES$"m5X>eDr; Ѓ4F OU&heF#8ikC55@aA5P86"E.eR^3M( q0H)X!"-ԵHN2h@c1lU8̭lPfiPB5]s/ۡ#ywg= ǿV1Ƅ6x273ꪦnxK\(d"`d3NH|stw%RȄCvzsZ ժ!TH{˼u䬄1^tF.br~?zm@ ;}ic7L|,ɸp鲝w,~{#1%xMkFahŒ%s%K @[nh>fa3 hA$ޱi2CNZ>d'-Ikmō 8iLq_#֪5#z$lрZĻl.|9ޅ]Q>koUxXt{};1T r) [Fz9G+_dlb'@>y{Լ}UϽ5%בӥw?VKdAZ>c.%׿j@(qseFM( *.`!AF6RAa'?h61u7Hì^)C%9sB0W<пEcP 9 Կr/zex A>PwD|?&#OBhW™hel{>yłUTFTh@󷞦GϚ2#P37~|?j_ִwT'ǁ&~m}jGph] AFe=6<@sDӈ&<$?|m,'Tevu"8@Xq2q_WiOnv/w>KԮeVzJr[d LccKMhR{δ,ӝG%R/ \`Nv_zCAE{(K[6HH((nu< Y+C(ў]҄,eAkx @`L`䋇mp4̥ix\̈LzXq[YYݯSyÎ (4bl]~Oo(98g]^Ċy: AIb|C[ zR2oC}C4Qt*QHu! W‰q0_8p}v@\sά&"ո!{r ՞q+k:fhP{24d[Chzi's_"lg*[X'} *7·ȼ* 2 /M.5#-"H#^?;:N7mNU䥽''eIYE ѷKCg8A-{?@m)F&-"aS7蠆 SIa?Ŀ O!)9p݈0HwVpHB ߙkETMCe/=S43gYv@w_mp )hMMU,GV b@=FMmbܔ5 }Z`QW G Y!x=+`UaJ- )# R֦ $ ;)~ZH,U0h;Ì}z8/ P' vPTt}%)G4, ӿWj8<$yӺ~ 43\8 kE٨Du{H Gp_"ym|N7Wo. +MX@볎 zs&N{N?4HJ|n|݋FQmb5!9L#kh`Oэ7ސ|}yOϣ)[c-Oz|dq^R:[+]Pz(֨˘Xڭ(W/\Z5/9s=sc\1Ll9ozfee \#Ïsƻ ceͻHTRT2U?*xru#xn.1ƞ\○ECrѼ:n1 Unm,A̿ˠܮb?{ -$\w2b=3gbGcpAEZEajI"I}SꇞсKiʙGokJ-tl.#)t\nQM*MLd':6=ك5B%E >HDyRэrT@1n7#T8pa`WMK-ϙV|:Nݠ [wP#MG2`'5LT_2 kϚ(Qeˋ˝YQ_˭T tz?We6gK'ПpZ7$Z_\̟ >?/Z(\'ћI3k:Λ9A]jP@Qt,̩jA#E,_ p$  ni~1c-߇ BL\ԩBmBcҖ˜f>3\,-%/<ΘD|$ȕN |.F)̸!nitZS\}H? \(Rzt`48#Ӌ1V~<p 9k8lmo |A;_^%$Q YŮ$ɯ/Mp1%;C"AӽrSsvMC]W7wRL]7,1\O̹O6+tmW3|bH]Safn8eWcfod߷?eH†$OOݙntt~=='A?H,=IP$"_Ay5Z0<@R/$ (?H :G?~?@@TcjH|pN"sߗ.DpGB[ ?W/&'!c"3$Oz>O]ɓ۫RGPksR덕wUHX$p{gp`η{j=TU#WWUU$Ou((v:̮$;_K`pqtFn1U ~qb煵kUWaΊU79g: JGo嚿#Oセ$s30̞*VPBW==|<c['=Mؗ2bԘ-\JE9\U_3WlW66Q?_l_GQ:e9z鿥>O謪_K#K/HO?{ATí yva\ayuN?W5ɏò͒8QEx2  )Ӟj~дD0@oKH) 2ez92uU _ /z+YtobN7ɞWZC?)G0i=k׽݇c:GʲE!ArB9k^<6[&}We-wsVwwK6m{܃eƇ"u'rЭ,gy-v@v {Lf$=(]G;t6]>Խ\괎.b?QXܚN.4/ˏ5-RmJ zImY\3Qݵo)25]}PvJCޭt8Z;D>n |LFeNU95?>W P_Q?YWДNWjr?`JhD\35O}G4q;X%J&`|H雧ֿ~ړmMVT@©G~^)Ws=@]z^j(Q7w?oD7w* ?7?^wuǰ><hʋU0"Ki0s5cS2֟J&$N+]^)f[a~wBxL y!wT7;_O> gm˓,U5RR򾊫^+?U4Hx6y/-f~~x9g+=_W>:\N?ӭqgoI6o~_)=vlQwl<>.ηV+~S>_WNAhx%]~e7~1dxsioP ]m۶6\^M;Y&ɾ+Mx/+O׆qafin7?D9d[CЩnǪ8_KY0&+?䂤(^رQ8|ʥ읾ssՋS'\`vh+:7r Vj>ߕ†})W5|lSgxe~ңy{!%w)WØߟei_SmA%=CD~&|I–Ћ'|)āTT$Y)nuOrmwF8L2=o%3D{ql*B֨JTjePv7% l47:"tP] Rۓ > ӫvETYj^>X6^ ]x]N99*/{9e/T'3oS4BJS|͎?5!fCoӱC壤/|͟l?9H{?|.3njkOxPz0w8N`AwyAO6#[:PG:t6۴UD{ui]^/GalO],]^{>2*PCDbSRr a1bAnX?*;J<;ٛ p x5]sPn)$i_"c߷LSP[;|W}I1\uωP͗O~kUb\уB/9t*9N7AC?YT| 85z|  iU'_,X(3vgwr#|yy߷~<՛O3Wcqow3s<@D/s". 9:@jJ(3l?jj5+ }=Jr(m_#.X1 aB&IGև_6ʫ`%G#[{:/O49 Nuc=_I:ٿ+=}1+.81*C7|8JS9?ϯQMK[զ-L}ymܨ[eg1nN}y#y30[C//0d֨w,v}u^R~rrB'fעQ lΙ% @UKZLр?ԉ##'s{l ~[u:j, BW@reMĐXI/'%#|ȖWʍ {t ah5V0]a@巫Z @`TS=dctiLHi eP$_npcRQgm$,*mZ%oI!Ydq`Jצcr-C `\۝iM YH 8`ѥRjHQސFn qY0OeIu|MC tͺd6DD*\7T9# 6X1B -՘-- 6 jNH8䈞ˊ_[Ua]w{ş;R +D>)FnPD{XZ _ۆFcfd(d`r{ NUQlɕ\RWQi|T/m3:s) UmF2׷\z,x50eQa+6wV6DN<2$̭ ⎹sBgkx&s՟"蛚S=w޺BREUŞέ_/WvGV19SyWcOOƯV}0c[\ݝ<=N++gJmL!vXBNǥCzSݟz9X~~{>T'T~] :\ptsk'!2|w/#ۂ]_񺑟}&{ɭXc>CǙ ffv*娔}ԬX Ü^*q>9BU0t_\\;khWaW70 =H\= <z 2GYnXyz<`;6$u \,#T2QG{~.kp]4(/4@ҞWR&+}l5n% VXҙc؇ ~iҒZL3+=D]pB9"AB3P5-x?"@!S! WP<|4#?N6+|23UZ)ZVy\qܳ\U . 3˧Ժ/ɪz@{Xjk{ձh3Tq{Q2sZeu8$xd]mMU=lZV?t)t${y XƻjF~\tԙG<|c>Γdzr}@= U\>N񐪛ga<&~~r*T/4[N]3N>nW̜)?ۜs6nr}~ߞj`ۚZC !lqv'貪&\/!#"Fa &W)Βߗ?\&2Զ^粓ɑLerT`q>1@$QFIkqOpKb6O=R$R>R=*̯v^QL ĺdI<,[4aPm>|Tȍ/_Vjix2.):ʜz{E; |AfjCi1,,˅ #<IJ?Se8xHӨ>c9:%r{gvDgXͼ4>kE'Q}=I@hC}= l 7xBp қ8[:ڽ;,#pip]n6tE Flj`8+;lUa(VwU#6Fk%ڡ89-ٝeEV~U}S>ETL1mTOwǽGanih1AG0>]=9tFGio^/?oݰeT&}FeӍeYHE|vw;ޜ{qyc8ȴ^}+qR2Y!+cSѓzgףi6lh)juSѮv>i=X*`ɅA&-\v+ը/NiJ(FT\6Ԫ/alWGAgSϭ_)9jK^]_™=v;: Z;{KnT[_G! tdzZlU^Gݼ}=n(eؽÐV̲VXO|_nY062G>MR[5k 쥩lTDMcs \Xo#\U:voRՍؑ0.]y8ʎť/^Jv'Zc 㨆p814cNqS.~6 kè7<'Xk,DVemkI!?>paїn4NRJ,pFK`ݹ ڳU#`aBWG)z}۝ԮDLGq{PY:K쇑M([^JRVOW_"l [< }dRzTLBYAhT靓'INٔOJ" S.ϞO_1_}KW}pJجPwMeH%`:?[ Y AS ^X57 #1v13B̒HS3,d&mŋ"t$@7l p_2~mJs{`e &;1n8m$\ 5vWg~~S=38i uc#3t4,̒\u(A$(J%4Zq`4 ~xАiHl7\5gh qM0g8޲ތDbإI" |΢Oo<#0 fLqPʂ2""B|7UZb;oGol.? C/] _1WwrR =Aȟн>c㻿9L' tInǯAm|Xkg\Nv/Zꆜўn6RaNڢfUf5Ir6kP`+do}Q_t*8@2^,]gJM.:I1^Jm.cjƘ/PuuaM= ̣* **]r9Q;rM cx ZZu,5nzSPW7K,}Q7UڱBA "HЁ\ . G٬`Ikgyn2l(a_+nWwŷX6aJ%זRFhk5 QU^Gq+r#t]V5d+JLpعP/s]ԯ1sZcSa0HLkn0#pN}GxA\٬Nwv@dא`JJ&z]I9I2X{w Jʶ>5ڲ2u҃p HTR^:1l4`ܠ_zԒ!d!0oJ宗ѐ%я~zYƴ8zѽEP[}Eـ;9|8#/^"b|O]|tzK񟓁i:LKGF i5ZfÌ!k {U-]%BiDvff~[#x֒oZ~_!$J EhP \yne$ qwSk@e,I-eFR zb5շUZaPyM!iuۛލ|l0*̤=7}\/qusw=+nOˎX*N:#DCgVq/oB?#@!|ڣsݧ}o!!u$5{;C.ٮPܒX D c] or!x:u&ZeUK=J`aUT{ɦ!X|k87:ER1_v$5+3D Z%y!B$Mlv;'ַա]U}+kUWTt¹U}I{>׼ISM!v5e+fK-9] T#!6Mԫe8oCΛ8eS:G?F>o#TapjϨx_>W\Q~gy={M%JS,~vAC{rt)G<0>t;_ xT?\K y閒CS[Yo?Øy"Gw\\18M$ V2t_L,C( XbjÃ^C(_N\N%=Czx?NrGdŐ\-R.ۚ"?g)MYs9 :fNz~(-*Oߩ\.Px׾e`~v ӣ$AYpK[l%;NqS%id}WL4}wv +O&I/*<ұ=Ddr=}*7#3#Ob}[=Mzxrn#SC?2*w#"cXIi JAlguKY5"͋[f)ovQ p" U:ż59T> lm):9έX"qIMj}xA(Lz0|6~72-&A=xx%ePYm }%b#<@R$#۴ >?/ {mT\( PcF⦨<;@Y0]NJr,+='*)V t[FpdU04y>>QxX^G9a}4oidfql7UĜ1Ѣ 89G⢚T9B@:_Z h$5=bvj M_ #$`I I%x"M"@j(uj؜!`9ggCY+zC4;:ګ un;0d8樵 f*_P8" ݿep:nqGGQF޵Q8āq חQtmw>! uC B:kчu J( h(h(*EEX*Tkϳۼi?OL_lx!*T RB<1o={DA, !@A<|*`&"+1Id";uN Dqy WSfI!(${zN2Nn2[;-f *!dހ&(TA:2d@7b\_ՒgšDD "$P P,J23TDUUSAE!B4UR0H( HP NE66S v'j CCCC!iYڴXʁ`QmDVi#V )uXb slmY6.VM[!K!KնRVZyNs.j՝;h ڴmXV61k;χo(e4 @5܁SXT!VF[je{ Шwv6 !!2p%.#S.LFڷ+QBZD uƮt9}U`ʍ!/-eg_*"G\\v9=cLM}-;cf|dgǨrDhfے-J"*Dfnu:^Ԉ 9]s\mqZ9bᱺ^  (Ic"VeXjΧ:6a¹Qç+`~zAMB RBVGb%ը6uΩl6|n.Rﮙ h0׳!sgmtp69-jWMl}z/Cf ڈ? }ڞTDxoZMȈu4?s 4GXvQ TP".z S`O"Xp4Xzz:2nϘwڻ(ƚu!k {D ʒGib֝t ʂbJ ,4z^Dz޻!h3_Jhfޡ@xD";/ A!i4m'3sh@?2h:ٸ'$KWیȈX--&0Ka"IYd)); Kb0OY#'T-tiR(=ԄWk&ÕYpA⥹v9ۭĆ$x;8;g3>I$CUШBjF""0h4q(R*4(؄aCI3 QW0Z)"E4{Hb*VHca A'ܘ`fbE(&%U <3~oE $HM:hn_$ R,53F~F}ǜB~Me'qn-7IΑ$L jpɒtD+E+`¡}(z 5 v%[Yv':TV^=AvU߯YIX".hEzc}e? ԇ~ f0# _'.A1t ETuDchn9A$@x#`"3~DZg 7LQ.$!UE'!Q)ZgT}!!EiNXrɎS+ó6oDd  IKRP xZ!4~Ƶ|flS0a]8j5մ6yS6k-vo{{nzz匇 n*D3מNH@JL URM9F_@ I&xWפN:YC3$qkK;x`XLqqiA#q/Ց{RXf`J}GLk-ъBov&Moj4`+| CD$ _rɏg_Pw( @leG!q`0ͧAOV s#: 'd/jԽckVQ,>ēe>D6X>S3(WV~ Ԫ ڴg3Xt='չJrd8ʋSoT&ъV3y6;f[ lo9 Ě.$ݢ XUTZbVz}_^^`Xsʤ!"F֯±77T@i8Nw8QJXy5R&oYaݍhU7Uqsuq8W|IN|yq,Ӄt,gۿ8yu_=ek~x7_]50?Ͱ]=NuC](JzҾTezfl󢩳d><,MIowr,uFD w37४Z}!ȋO/0 n[D,` B+ @X)Pџ">j8U P;7Bֳp$ y8cWtˢ88"8}].lEMq~`y_?t}]z**N;>Ivlʨ:M- :u#N[{r,$BR}ۦȽ%m_F0~|%>-=ZCՈ|?W߿vb1 ;=HrƛSU x8R"ZH1ʗ䋓m@ a ͓ɮB+䎇y\ $6flJu+!3cſ&vb9$dЙϵZ3w8M΄}|qj=}u[oPO Y*u*TsC!HF4b&?wGFڒJ͚|HBb$wF*&݇Ϟ5Gzv3̽fp]4Bj^`[K? `c&BzvkۓiqWIgJOi6UF {Q5%q,gY孟7yQ:N#k3C$Yd&8/?7΍4X|l~]7ߩ_!,$d`Hp2/Kǥ`U$'A~]gcj,]Pp~ xcZ͑1`E&_AʨQz*E0_jRCYG{ȿS 8qw"*F{k팸_'YNaF^eQaQ{&A&5P9g3:tJ$LW5`za o^gGF3i> qMU5\!ܱ22gGrNjM-t1}թ*B$ 0[hlfYk {U_S>BxؿF!ҏuPoe+aouhw]bu=Q./I]Tm+0$Pһ51fջ=}EŴ!oV/SY.A`* (#; 7gE޵5c -PgtE'!.L:X6}"Ə_{@*$YQ&,cɐ& 4 K *0_[NstL@}EU[kfY @:$&YK qg=ŰvBuni {|ee>QO@BxP.J\zgn@b̪҈UBSJ`4({|>]@@%{jT}qbu~pZÑ [] BeDQJ*"(76yw);oL c!h^%K bxph|]yrgy`7GrYBGV/۾>Qy>QouM[Hz60<,mODoP#F{'=16}s☥RSjnSr ؀+3އ4㷮Pr24D p2|,!Ug/KQ{1H,]_/_^PۀŊރvz4e,zU4̌@x#bp|ԪNYs)% 8`2(i&b0P9Qbݕ:,uB=-qΨb~a Ң9T+X(|X=N-0ZONϹj 7^ ~Fvhx$-ZnTU 8>FpĩscKDUGyBH g }x$>ؙk,{h%F7vSσڧ`CM۔.beDEÅB;UenX>e?~N`DABJyg3}ud}c9XQ~ȝ[WxӄƇ3RJM~{=}m5ѵұ XSd G`9P,t9 ّJgEW׏-x}EyruA}BCrW]'?'2IǧS?Q)XF¤#6NpLh`5kat%Og <`锯ۯ߂u\U Kcc4C