summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSander Vanheule <sander@svanheule.net>2022-08-07 21:21:15 +0200
committerBartosz Golaszewski <brgl@bgdev.pl>2022-08-31 17:46:30 +0200
commitee0175b3b44288c74d5292c2a9c2c154f6c0317e (patch)
treec7ee8f9a7ef579a65186dd231102392b167aaff9
parent518e26f11af2fe4f5bebf9a0351595d508c7077f (diff)
downloadlinux-ee0175b3b44288c74d5292c2a9c2c154f6c0317e.tar.gz
linux-ee0175b3b44288c74d5292c2a9c2c154f6c0317e.tar.bz2
linux-ee0175b3b44288c74d5292c2a9c2c154f6c0317e.zip
gpio: realtek-otto: switch to 32-bit I/O
By using 16-bit I/O on the GPIO peripheral, which is apparently not safe on MIPS, the IMR can end up containing garbage. This then results in interrupt triggers for lines that don't have an interrupt handler associated. The irq_desc lookup fails, and the ISR will not be cleared, keeping the CPU busy until reboot, or until another IMR operation restores the correct value. This situation appears to happen very rarely, for < 0.5% of IMR writes. Instead of using 8-bit or 16-bit I/O operations on the 32-bit memory mapped peripheral registers, switch to using 32-bit I/O only, operating on the entire bank for all single bit line settings. For 2-bit line settings, with 16-bit port values, stick to manual (un)packing. This issue has been seen on RTL8382M (HPE 1920-16G), RTL8391M (Netgear GS728TP v2), and RTL8393M (D-Link DGS-1210-52 F3, Zyxel GS1900-48). Reported-by: Luiz Angelo Daros de Luca <luizluca@gmail.com> # DGS-1210-52 Reported-by: Birger Koblitz <mail@birger-koblitz.de> # GS728TP Reported-by: Jan Hoffmann <jan@3e8.eu> # 1920-16G Fixes: 0d82fb1127fb ("gpio: Add Realtek Otto GPIO support") Signed-off-by: Sander Vanheule <sander@svanheule.net> Cc: Paul Cercueil <paul@crapouillou.net> Reviewed-by: Linus Walleij <linus.walleij@linaro.org> Signed-off-by: Bartosz Golaszewski <brgl@bgdev.pl>
-rw-r--r--drivers/gpio/gpio-realtek-otto.c166
1 files changed, 85 insertions, 81 deletions
diff --git a/drivers/gpio/gpio-realtek-otto.c b/drivers/gpio/gpio-realtek-otto.c
index 63dcf42f7c20..d6418f89d3f6 100644
--- a/drivers/gpio/gpio-realtek-otto.c
+++ b/drivers/gpio/gpio-realtek-otto.c
@@ -46,10 +46,20 @@
* @lock: Lock for accessing the IRQ registers and values
* @intr_mask: Mask for interrupts lines
* @intr_type: Interrupt type selection
+ * @bank_read: Read a bank setting as a single 32-bit value
+ * @bank_write: Write a bank setting as a single 32-bit value
+ * @imr_line_pos: Bit shift of an IRQ line's IMR value.
+ *
+ * The DIR, DATA, and ISR registers consist of four 8-bit port values, packed
+ * into a single 32-bit register. Use @bank_read (@bank_write) to get (assign)
+ * a value from (to) these registers. The IMR register consists of four 16-bit
+ * port values, packed into two 32-bit registers. Use @imr_line_pos to get the
+ * bit shift of the 2-bit field for a line's IMR settings. Shifts larger than
+ * 32 overflow into the second register.
*
* Because the interrupt mask register (IMR) combines the function of IRQ type
* selection and masking, two extra values are stored. @intr_mask is used to
- * mask/unmask the interrupts for a GPIO port, and @intr_type is used to store
+ * mask/unmask the interrupts for a GPIO line, and @intr_type is used to store
* the selected interrupt types. The logical AND of these values is written to
* IMR on changes.
*/
@@ -59,10 +69,11 @@ struct realtek_gpio_ctrl {
void __iomem *cpumask_base;
struct cpumask cpu_irq_maskable;
raw_spinlock_t lock;
- u16 intr_mask[REALTEK_GPIO_PORTS_PER_BANK];
- u16 intr_type[REALTEK_GPIO_PORTS_PER_BANK];
- unsigned int (*port_offset_u8)(unsigned int port);
- unsigned int (*port_offset_u16)(unsigned int port);
+ u8 intr_mask[REALTEK_GPIO_MAX];
+ u8 intr_type[REALTEK_GPIO_MAX];
+ u32 (*bank_read)(void __iomem *reg);
+ void (*bank_write)(void __iomem *reg, u32 value);
+ unsigned int (*line_imr_pos)(unsigned int line);
};
/* Expand with more flags as devices with other quirks are added */
@@ -101,14 +112,22 @@ static struct realtek_gpio_ctrl *irq_data_to_ctrl(struct irq_data *data)
* port. The two interrupt mask registers store two bits per GPIO, so use u16
* values.
*/
-static unsigned int realtek_gpio_port_offset_u8(unsigned int port)
+static u32 realtek_gpio_bank_read_swapped(void __iomem *reg)
{
- return port;
+ return ioread32be(reg);
}
-static unsigned int realtek_gpio_port_offset_u16(unsigned int port)
+static void realtek_gpio_bank_write_swapped(void __iomem *reg, u32 value)
{
- return 2 * port;
+ iowrite32be(value, reg);
+}
+
+static unsigned int realtek_gpio_line_imr_pos_swapped(unsigned int line)
+{
+ unsigned int port_pin = line % 8;
+ unsigned int port = line / 8;
+
+ return 2 * (8 * (port ^ 1) + port_pin);
}
/*
@@ -119,66 +138,67 @@ static unsigned int realtek_gpio_port_offset_u16(unsigned int port)
* per GPIO, so use u16 values. The first register contains ports 1 and 0, the
* second ports 3 and 2.
*/
-static unsigned int realtek_gpio_port_offset_u8_rev(unsigned int port)
+static u32 realtek_gpio_bank_read(void __iomem *reg)
{
- return 3 - port;
+ return ioread32(reg);
}
-static unsigned int realtek_gpio_port_offset_u16_rev(unsigned int port)
+static void realtek_gpio_bank_write(void __iomem *reg, u32 value)
{
- return 2 * (port ^ 1);
+ iowrite32(value, reg);
}
-static void realtek_gpio_write_imr(struct realtek_gpio_ctrl *ctrl,
- unsigned int port, u16 irq_type, u16 irq_mask)
+static unsigned int realtek_gpio_line_imr_pos(unsigned int line)
{
- iowrite16(irq_type & irq_mask,
- ctrl->base + REALTEK_GPIO_REG_IMR + ctrl->port_offset_u16(port));
+ return 2 * line;
}
-static void realtek_gpio_clear_isr(struct realtek_gpio_ctrl *ctrl,
- unsigned int port, u8 mask)
+static void realtek_gpio_clear_isr(struct realtek_gpio_ctrl *ctrl, u32 mask)
{
- iowrite8(mask, ctrl->base + REALTEK_GPIO_REG_ISR + ctrl->port_offset_u8(port));
+ ctrl->bank_write(ctrl->base + REALTEK_GPIO_REG_ISR, mask);
}
-static u8 realtek_gpio_read_isr(struct realtek_gpio_ctrl *ctrl, unsigned int port)
+static u32 realtek_gpio_read_isr(struct realtek_gpio_ctrl *ctrl)
{
- return ioread8(ctrl->base + REALTEK_GPIO_REG_ISR + ctrl->port_offset_u8(port));
+ return ctrl->bank_read(ctrl->base + REALTEK_GPIO_REG_ISR);
}
-/* Set the rising and falling edge mask bits for a GPIO port pin */
-static u16 realtek_gpio_imr_bits(unsigned int pin, u16 value)
+/* Set the rising and falling edge mask bits for a GPIO pin */
+static void realtek_gpio_update_line_imr(struct realtek_gpio_ctrl *ctrl, unsigned int line)
{
- return (value & REALTEK_GPIO_IMR_LINE_MASK) << 2 * pin;
+ void __iomem *reg = ctrl->base + REALTEK_GPIO_REG_IMR;
+ unsigned int line_shift = ctrl->line_imr_pos(line);
+ unsigned int shift = line_shift % 32;
+ u32 irq_type = ctrl->intr_type[line];
+ u32 irq_mask = ctrl->intr_mask[line];
+ u32 reg_val;
+
+ reg += 4 * (line_shift / 32);
+ reg_val = ioread32(reg);
+ reg_val &= ~(REALTEK_GPIO_IMR_LINE_MASK << shift);
+ reg_val |= (irq_type & irq_mask & REALTEK_GPIO_IMR_LINE_MASK) << shift;
+ iowrite32(reg_val, reg);
}
static void realtek_gpio_irq_ack(struct irq_data *data)
{
struct realtek_gpio_ctrl *ctrl = irq_data_to_ctrl(data);
irq_hw_number_t line = irqd_to_hwirq(data);
- unsigned int port = line / 8;
- unsigned int port_pin = line % 8;
- realtek_gpio_clear_isr(ctrl, port, BIT(port_pin));
+ realtek_gpio_clear_isr(ctrl, BIT(line));
}
static void realtek_gpio_irq_unmask(struct irq_data *data)
{
struct realtek_gpio_ctrl *ctrl = irq_data_to_ctrl(data);
unsigned int line = irqd_to_hwirq(data);
- unsigned int port = line / 8;
- unsigned int port_pin = line % 8;
unsigned long flags;
- u16 m;
gpiochip_enable_irq(&ctrl->gc, line);
raw_spin_lock_irqsave(&ctrl->lock, flags);
- m = ctrl->intr_mask[port];
- m |= realtek_gpio_imr_bits(port_pin, REALTEK_GPIO_IMR_LINE_MASK);
- ctrl->intr_mask[port] = m;
- realtek_gpio_write_imr(ctrl, port, ctrl->intr_type[port], m);
+ ctrl->intr_mask[line] = REALTEK_GPIO_IMR_LINE_MASK;
+ realtek_gpio_update_line_imr(ctrl, line);
raw_spin_unlock_irqrestore(&ctrl->lock, flags);
}
@@ -186,16 +206,11 @@ static void realtek_gpio_irq_mask(struct irq_data *data)
{
struct realtek_gpio_ctrl *ctrl = irq_data_to_ctrl(data);
unsigned int line = irqd_to_hwirq(data);
- unsigned int port = line / 8;
- unsigned int port_pin = line % 8;
unsigned long flags;
- u16 m;
raw_spin_lock_irqsave(&ctrl->lock, flags);
- m = ctrl->intr_mask[port];
- m &= ~realtek_gpio_imr_bits(port_pin, REALTEK_GPIO_IMR_LINE_MASK);
- ctrl->intr_mask[port] = m;
- realtek_gpio_write_imr(ctrl, port, ctrl->intr_type[port], m);
+ ctrl->intr_mask[line] = 0;
+ realtek_gpio_update_line_imr(ctrl, line);
raw_spin_unlock_irqrestore(&ctrl->lock, flags);
gpiochip_disable_irq(&ctrl->gc, line);
@@ -205,10 +220,8 @@ static int realtek_gpio_irq_set_type(struct irq_data *data, unsigned int flow_ty
{
struct realtek_gpio_ctrl *ctrl = irq_data_to_ctrl(data);
unsigned int line = irqd_to_hwirq(data);
- unsigned int port = line / 8;
- unsigned int port_pin = line % 8;
unsigned long flags;
- u16 type, t;
+ u8 type;
switch (flow_type & IRQ_TYPE_SENSE_MASK) {
case IRQ_TYPE_EDGE_FALLING:
@@ -227,11 +240,8 @@ static int realtek_gpio_irq_set_type(struct irq_data *data, unsigned int flow_ty
irq_set_handler_locked(data, handle_edge_irq);
raw_spin_lock_irqsave(&ctrl->lock, flags);
- t = ctrl->intr_type[port];
- t &= ~realtek_gpio_imr_bits(port_pin, REALTEK_GPIO_IMR_LINE_MASK);
- t |= realtek_gpio_imr_bits(port_pin, type);
- ctrl->intr_type[port] = t;
- realtek_gpio_write_imr(ctrl, port, t, ctrl->intr_mask[port]);
+ ctrl->intr_type[line] = type;
+ realtek_gpio_update_line_imr(ctrl, line);
raw_spin_unlock_irqrestore(&ctrl->lock, flags);
return 0;
@@ -242,28 +252,21 @@ static void realtek_gpio_irq_handler(struct irq_desc *desc)
struct gpio_chip *gc = irq_desc_get_handler_data(desc);
struct realtek_gpio_ctrl *ctrl = gpiochip_get_data(gc);
struct irq_chip *irq_chip = irq_desc_get_chip(desc);
- unsigned int lines_done;
- unsigned int port_pin_count;
unsigned long status;
int offset;
chained_irq_enter(irq_chip, desc);
- for (lines_done = 0; lines_done < gc->ngpio; lines_done += 8) {
- status = realtek_gpio_read_isr(ctrl, lines_done / 8);
- port_pin_count = min(gc->ngpio - lines_done, 8U);
- for_each_set_bit(offset, &status, port_pin_count)
- generic_handle_domain_irq(gc->irq.domain, offset + lines_done);
- }
+ status = realtek_gpio_read_isr(ctrl);
+ for_each_set_bit(offset, &status, gc->ngpio)
+ generic_handle_domain_irq(gc->irq.domain, offset);
chained_irq_exit(irq_chip, desc);
}
-static inline void __iomem *realtek_gpio_irq_cpu_mask(struct realtek_gpio_ctrl *ctrl,
- unsigned int port, int cpu)
+static inline void __iomem *realtek_gpio_irq_cpu_mask(struct realtek_gpio_ctrl *ctrl, int cpu)
{
- return ctrl->cpumask_base + ctrl->port_offset_u8(port) +
- REALTEK_GPIO_PORTS_PER_BANK * cpu;
+ return ctrl->cpumask_base + REALTEK_GPIO_PORTS_PER_BANK * cpu;
}
static int realtek_gpio_irq_set_affinity(struct irq_data *data,
@@ -271,12 +274,10 @@ static int realtek_gpio_irq_set_affinity(struct irq_data *data,
{
struct realtek_gpio_ctrl *ctrl = irq_data_to_ctrl(data);
unsigned int line = irqd_to_hwirq(data);
- unsigned int port = line / 8;
- unsigned int port_pin = line % 8;
void __iomem *irq_cpu_mask;
unsigned long flags;
int cpu;
- u8 v;
+ u32 v;
if (!ctrl->cpumask_base)
return -ENXIO;
@@ -284,15 +285,15 @@ static int realtek_gpio_irq_set_affinity(struct irq_data *data,
raw_spin_lock_irqsave(&ctrl->lock, flags);
for_each_cpu(cpu, &ctrl->cpu_irq_maskable) {
- irq_cpu_mask = realtek_gpio_irq_cpu_mask(ctrl, port, cpu);
- v = ioread8(irq_cpu_mask);
+ irq_cpu_mask = realtek_gpio_irq_cpu_mask(ctrl, cpu);
+ v = ctrl->bank_read(irq_cpu_mask);
if (cpumask_test_cpu(cpu, dest))
- v |= BIT(port_pin);
+ v |= BIT(line);
else
- v &= ~BIT(port_pin);
+ v &= ~BIT(line);
- iowrite8(v, irq_cpu_mask);
+ ctrl->bank_write(irq_cpu_mask, v);
}
raw_spin_unlock_irqrestore(&ctrl->lock, flags);
@@ -305,16 +306,17 @@ static int realtek_gpio_irq_set_affinity(struct irq_data *data,
static int realtek_gpio_irq_init(struct gpio_chip *gc)
{
struct realtek_gpio_ctrl *ctrl = gpiochip_get_data(gc);
- unsigned int port;
+ u32 mask_all = GENMASK(gc->ngpio - 1, 0);
+ unsigned int line;
int cpu;
- for (port = 0; (port * 8) < gc->ngpio; port++) {
- realtek_gpio_write_imr(ctrl, port, 0, 0);
- realtek_gpio_clear_isr(ctrl, port, GENMASK(7, 0));
+ for (line = 0; line < gc->ngpio; line++)
+ realtek_gpio_update_line_imr(ctrl, line);
- for_each_cpu(cpu, &ctrl->cpu_irq_maskable)
- iowrite8(GENMASK(7, 0), realtek_gpio_irq_cpu_mask(ctrl, port, cpu));
- }
+ realtek_gpio_clear_isr(ctrl, mask_all);
+
+ for_each_cpu(cpu, &ctrl->cpu_irq_maskable)
+ ctrl->bank_write(realtek_gpio_irq_cpu_mask(ctrl, cpu), mask_all);
return 0;
}
@@ -387,12 +389,14 @@ static int realtek_gpio_probe(struct platform_device *pdev)
if (dev_flags & GPIO_PORTS_REVERSED) {
bgpio_flags = 0;
- ctrl->port_offset_u8 = realtek_gpio_port_offset_u8_rev;
- ctrl->port_offset_u16 = realtek_gpio_port_offset_u16_rev;
+ ctrl->bank_read = realtek_gpio_bank_read;
+ ctrl->bank_write = realtek_gpio_bank_write;
+ ctrl->line_imr_pos = realtek_gpio_line_imr_pos;
} else {
bgpio_flags = BGPIOF_BIG_ENDIAN_BYTE_ORDER;
- ctrl->port_offset_u8 = realtek_gpio_port_offset_u8;
- ctrl->port_offset_u16 = realtek_gpio_port_offset_u16;
+ ctrl->bank_read = realtek_gpio_bank_read_swapped;
+ ctrl->bank_write = realtek_gpio_bank_write_swapped;
+ ctrl->line_imr_pos = realtek_gpio_line_imr_pos_swapped;
}
err = bgpio_init(&ctrl->gc, dev, 4,
% B|mhcfX"_\Ⱥѝ!Y,5  >ς. mp⥥Їfǘxwu2yt=̓R7AFYB88OO3Xw]l3w93IiTǽ;v.yw(χcR-ijh=姵i@]PN7q*9\ r*L ).Ȉ@zهw2l-r%DYo\V&Tb"`Mx֋]IU ,MR(&=#W4DAA.ss _&۞5R\ IBđA JFAL" ΙsC:usz3тS:?geILxG{r?" =} &76-О8e@t9}\Mûui5{a;L*~Vo`h\!*:#auuOVU+8ԠE%b87Bs M^/;0w=X_8+]s2TwM}3fG ]$W/dz3<bRC49lWgPl!.{yc,0wicq[\|  캤Hy'?=<5|ӎ.?tz;\dx*\LZf#=If*j3W)WC2F'H2xg8|?6(τSX$Cg#2黎k#rs*> fg]䆯e뎳}I3G?^gx#?(랒"kMgiLxgkU"< y+БCPR ]qr_o?J`<{ܤzw^ttV@\C͘ظ˞3I5HXp QeT >fY ȠgUV\f?p2RGᄋ*vJl&$>!i Y"W*}’Q|sdg0C bkoI7Lrc>`~2s 9& +ZPI0 $Kz(«-7 EPh$akzNnm٣|*C]luQ p_-zQ~uojp VmݰEmY*r톷1YáG u6~y,Ry=~"sjjs!'2_a <G|uN=X6Y~15mst(_"ݑz:ը8'^!9R5wdEI4c+/W"(^:Ax6Wj^D?8|ucY!KW=jȮG8'1.grEj1C{M-Yz ?;>䬻/TK5pηX^vEIY҈瞧dFdR^JZ =.+WWԷ=R Zae2ɔ* `Ңj0mG:YlMRKӏ1Y!|N ;8BJVYw3𛆷LW%g R|Ф#=n]I'Im1e9U #}m!pb^caWP﩮5F"-$C@_) ('^wP -wg=̰e}>7{<&((wSuuޯ ri8#7>;\֋e"\G}hF2?ͬQIA`pUPJI8nP&Kh{d#:#.{y^/x XQgdlYzH_!sDmg$EݸuჺUTȣ&퀎oG|OMe:x-0@<%@wiG"CǪK_z֞fm2lwH_b"rH.Q7f fG)&Qhkz38fGyYq-0:)4.tS5 Ė3q8y7amlrc -o9dxͳM[ ͨdž&`BHPC!=HrmCES`Qu&7JKFMia˲C\(EinSVέMd{7 ȇőXca+3 +#ٚ\b 'ȿbVEdIK%5W3XE.-b)T-Tp ( &;tw|c<9H_q:n&qr!߭/3ޔ!xOi3f!_F:} +}7 Ey 1F+)xLP]T+¯^k_(MvEMR}oL>+hA3Kտ 8~vz>G6;o~JTMhCgR&Y 2B1tɐ0&k>%<+ru5FmsC&]=Uҥ]{Qc+RVI. HhiEV(څdd &V)` nMшzȫ5P06M}?=ZE?]r0_ru1 DJ Y8 Y tMj] YY:*rm C)H<.0kܾ<|l$嵧"5 Or LW>6U Ľf: ;5'|D,NkP#YErn6NX1a}^弄8p{R;YMق a X/M 6jV.S JAH@]E.0tg :Ά ߘyS;?P=ޙKbB-u->ޓ8? CHDrc,k\&y?EhN &L_u9xV\<|\4z uI؂+ QVU; cb:<:NO7!h繒Aʃ2kJ$, wyј'+Ԟ<:,a<"q N2nȆfh\dxVn#i. ~ _InqS(w+O;3u𣈳3àJK> oO6/U뤱 AUH0Q FY9PҰeң!9Ўa%/Z+eو/)_>j/՛2!QipȪv3$/O-j`. )RcVSld{ݶ|q2ƛ ښ,4TlBe.V{Bo V_/h>,i(m?1j6PìqB2y\.?9|̈́)CK@[@j*~Cą$Ӛ~eOW8Dcr:^c @*`n$.Ykr ye=mW/n?FX 鯿V62Qh*K] W/:u}~Gʱq \cF|IuwuE^7yp<@b0*F'Yy֪{wp!ۗk=rk^{J$fs1vG{|hW~@Y{  - zL7Tw0&DrND *(Y9=> &vsOr˅K_U6Y_xNdD>iR.v˦Xa \cpsk2 Lu^uŸ֋l3#GD)ku r3FII`q3nG@Pz~o]#Z+Y,%-g!ы"Fx+ yЯ5BOLY(Kz\ϗ3y AB0z㭦,PŠ}2H;6H^T߸ PƓq/$޾WtVK+֓#>~A납 6je a(6WU0aa1αrC&B!H;jBE<'e9",@޹MXG lK P0(V ]p V|::0/T DyRMf\FjѰ, ?5y򐟋X?HFsM^ne0}t:6Aj/ ;ֲ@Gsj1|Ea~w1]uԳ"w0aط/SNÃXL{fE^D580ֽ]{IaJ.ŧBxIc顃=coi/N;C]k2XA;BN~J#QEwsiTAr!vm,y'&&8m9֩*.dJT^ T& qK_/ǭq>{9> sߦJCcAC}QɢxEIĬHLv'<&f]&vhxrao7^WVJEz) 1]P/~' g*#"cUbli[oϰ7WÏHU~g42$Ers0$Å (߮s xjl\,1؂+GT@}ힿng(oBeykd'a7(D H IaӍ|Q-لTBc^HBX()Ճ, xۍ]a%^> 7#6=g:ގNXJ#?Ao}2!PMχ6^"Ɗy֎E d~$c{%yq*'=Ђs=L( \ [܄I$Lg6xgF׾mI=`P˷'=iB)r͛?2c"c.cayֱQnzf#HkO[ZD (Q.Sf+0uoz኉H>ϱT <,Riν?6>^VsL ;y:ۆfR^ݔlyx(qHO2 YkepD8+Ͼj2FZK[˳y=|1F.`6hgY-W>pQ6s~B{)ʯeD5 '#8pW:RsQ6]/ 6 7ή} Ҁl4Jw`=6zP阄X;E[8:,;Ʉ d.bϝ m 2On M/fT-6[pe6{],>j YktEvae~{=D+hɢF轝W_N[#Uq-: ua鋽rg9[k%BT՟ xa8c n#V=4^3H,䯹<pABSAu08뱙uc9#[woke2e&y!weD.}!߈kˇ؋"IK,]{"QX2("bx*3; dո- w친_ }:apI;qj,\?^"0TȏOǏO9xE&a1B8}V{QBx =dzKy89L )_X摙 ,fa4S/w&Bx3B| <~ n uS?1!A1f^O>{ǧŹԡXeuþJ&cK0tsfzIЛ"ڝiAHX 9<|~A2i,{[4C]veⅪ_MPUf[}=aEWTK1J2%#RW?@&h٪5 @J JNVzMO?{oW9 G씣#3}8.¯U[m|S >|kͱL m$1gmt_o PgBk{%BHBj郌>] 2q]԰h.wunyqp_ H5|0k>(u-akga{d"?(QdSQuXUGϰtGy2mV "H5D 1!ds~z0O`h`(ޟS$(zqO) 1Qy$at?/(9x/j^8[~jv*7"u/#2Ǫryd!Rv07]qW<T*z2Q;.42%?0aA,?_>0ܼO1 y& ǞY^=.GO"k}#v3 fؽ`h|T|sꋎk0o 5wm6]EPs?N*"nrp›eGʈp'(*˜m]$?SJrHqܡZlM?;3a< BrK5yH/ KQآoE﹀OW]Ԣw0`GApZsˋj6Y">YgAsҚ2r|+,ڎњgk]#qH}<Q@B{!AԗebZ@ξ"(%5U"!82[#ta80NP\#b@orF_b.Ⱦ~3cj?itC6)w<1īj!Pdv4ТjjF5K sΚ`u5|}A-Xt[omfWu?AQ,Z,r\_ q }Vqm ]>O.wTa꙱qx{W\H3G-.UoƅHH_YHiID3 ^\3~OGǽrf4OCΉXu`_*o&]Q14i+Ʈse0U0x{/3'K2`"s򯗷໺D YWg~~,~elnY  *MNScG3]lΜ@n Dٕjh] (DH\X5SƾG_{h'zZimexBP;$U*ZmrC73Tݕ3~*,n[ߠ@HW8Ed |J[}P8kT][w nQ  CEu[u)tTmQKrUQ5ӯ ܦ@TFBǦyFW2i˝^VhV,HP^QN w3pQ;SwEé 6r5nu&iF "f`U)BJqsҤQ Yq n֗^Íi,`ix?4XjquFp1ƈ_#V0DO F04qҫ% ~ĸMC]}?%00t}# 4fg/@ߗ:֍_?lN+:lã@:FdGL^HK_DždpSgmeMUbFVڒ" ~JL>^$Mf,0lk'Zm-Mbv:# ,> zډ8ǏJR;yߕBdlCV=q}8\ZRh8#K'w?]V[9Bexg/`Gdj~ ƆY|sA3VkTH hnڪ_3Ǚa G(''#XMtj|VYx&SG@׌QCN:_ˤ07zMʗ"U@/g(Aj8'k5 ,%Qs&(=wYJ?ۆbԌ(*l!j@jS%dUI.giuXAuY$"5e!F/6s`zUJ(QX(MaD"h.SzO>m̮QQOX=]tdcal@)Pqc[ߌ+-M/XOl%TO7=BeD ^P ʿ'LK}3XuR>C >8DtX0'fSs.p[M֨徊25\ KtXI\X *Sq/Γlͼ’mN{C 1AB#Ma HL QY!|g_v! @v@G,sZZ-ʆCdt9]SL#zL.G W<^is& LUaU~ũFI e풪]M'!NQ_ĕ_!<{5v/<8xAESDA4׹Ԍ'l T23~'Hi ,U %uaqܰʎ{馐S9h_XKW@E۲{N'5ǻ}a4 ! ˯o +׶wi 36:~sz oف94e,"lx)qU<?E4F1uYL @[%DZݯ\F ->{tF=G;q! AZ T>hAHOlku?P ru˹bzW#>u kadvQnH=!%ഄr8O>rȞ6?yESbjXP1j)֛q|[ i}c *%78ط-1RP~z T4X2:ZMBh@mf|)Wh EH4f(닁uE&Y**V X{w49]a9,.0~)Gj5 לNI]5[):s8r.͛M ?jY΋*ʌU"Tu6t/|3(T4^18АVsMhVSjyc m%MF7> p}j[cZpVR&^cK~|Auy~^}n "EeEd~R 7%K m.}G-͌d -xs ߌ_l3}L!OWL8~hqa@Vs/N(7X[muFF:CHd\_>YK-;'9qq"8rA#!k﫦0ӯՅ?ČPksq `UlJ;%8G UP|iptZ1U"nPOu .O㋠ y\pkNx7fk1kMLww6eN$4]Z_dplo?'_0mC ~ uӘ7FӏQvoQ4V5[zr D7P@ӿ`GT]rn_7R#u=6پ.Й\Z$өOG(v.P2'5r+:,E>o ]'mvmP] ?FK4|O' %q^jF~}T< ]pzaιތXQ| 1 gsPIbeSxiLP4,\Уaz .WpCq[-M1jx}E3> F 0&;y^4u`m߄ +VH㯏мHZn 7NL-p7|y;)^?J}+JQ?ӏQo8.ltĽg*븵`hGJ)Ao$И=j DIWƄgד< @+ǿСcHX0Oi:L@NRYL$nmW>o܂\"Ky&-%\pMzWDLؤ=A 1+=scV}Pgp=P؎+9.| yW]3v:b/stM+2WnQ"~¦ s}RB*I4l><@qf@n_k. "U2`j^7P,jGw1Lgc͸ͱJvtWKUq,Bj7ƹ;9=q4zWurEeay'$׳u%bnYg: ,(uC _1{%qgSVː˝S;CCqKGt.]{p1hфfWc'3F$oD~xc;ՏomɍKpX)f +z@q6]zf%r#;$ a. 4CHcl>__x9fDK/BDd2=y:8r8Muc:??KW9pd A:僂 &f}C#fd Cf@q6ʽ}a!ߗ/g ڢnyw| -9oAДٿJ2% @LLo/jh mzO h6/6o@m│QڸE@fӵDN}}8̠#>dYIe]n(W!ֆIWp='-$G zCPIb TF E0wB]r]wjs˳8A;Z+"P5D >5)s܏LjUWTHgo0/ :^lRڅa<38 jK6>>MԯmwMoxo&?6#boM9pXO=;4|m-@YgK""yP+WFKpz A`S DF(~y(.p^V Fdo|[^`X ;x7xNu}"/Dn :q0$$GaL%i6/e8bBFN` @D55xâ(^/k4vS;7xUYRC|iێL>*wA_־OÛ4oYN;:ek,8kd M5:n^&E,74 Z<$t 8|\O=NwwАuY|$G773G?G*xTEǣZC|<ZyGhpZ5=>*z2 .X ƝM^w;oeKO⅋-#vʒJ~;Mt{/ 0>v[3KS6M]k<߰'$ǵDtQӢXT;IìT955=\){B}cJ<%w4Q]J  /SXQ pvj؉9x",SV.  O#H.\Ĭxh@Kn0"|X(UWTiUy$Inu9r7z<ǽݞwpH S)A}P&L}~CjQ?m=Þ/`Gf2z\E'+%_f.oſu!/좦4z,n{Uys,Ccķh!N{K4߾áCl!ӤFWK vA#g n][~H-աQHpZHY}H Cs_EAY(.zJPG`>+7̏cć,F8*.iI09؄$6dcK~f:1FPbb g{AnŜhx̚Xi;Ǝw:sC>߽}y Dvǹĵs6roI X" wD(D 'y Fu`\*Ⱥ*8ٓ" VUY2s C~B$|,B1ՓDBc3l{@'%ݹ&0fnUFpajK>MAip'\Oj(5)ju#r5//'F25s=wҿ2F2XRoR8H#W P* ٳ;AEpWk:oqe6 S8e K% sTz X`R-e7Kgi*#械EbIq{UL l2f`ΰU^^"`IDDD@A Xڗe3wzqh3R=:bɖ r_ɥY%|k/?[{cx?#$H|9ӻ&X,f/_R*/IZ73n\/5R{9C4癦%үT+XMԸ+n4IZddG*Y#SOegI24DЇFE /o<5 "DFJVėPHQTٸ18w^$JݻٔR 2,E!te(nK)D&Yq IJ/lĉYCθ 19`-*yq8wczd1˼j]}> Uo'ְl%6/j $X) ]y.HP `(,HHv4Ay#afMtJHRWNR&tiY(Dz^_ $gV7mߺ1Q`SMxC⟎z6V$k,vz}OH^} äpa\("*Y|8uOr>qn&8>t :>?,)XǢR3ң(C}r4cY~|{zq#$N{hyv“193}:'G ?O@ cTȡy`[^OÙ4潪[bqXA|Bֱ7syEy9Fts,94QM|2?/1[YmC7Qu9r?c_sUV%^|/tBy_u%;7Tk$E.w ZoŇte.kIئZ׭!x.#C-_cށӓҮ>GRQGɉ,t_:H?"LU-$[O)jdTocG_"^y⃤LEqh ɞ?w^:w|D 5 a>I4Tj ~7bAa( NwUX?iJ e @ 촂tjMSPXMT<h [N ,[(UKіYtmNyI?mU ozgg|^kϑ2(^0A+V5^}xC~p82!AkSG?v4:nczq:HIVc~OoZK0^zDd? Y@<;u)Č2U4q+ dW6a0(`ʷ,aeR 6ڼ@?wEfH\ru9+td N*IB v$e$aTqs=QN&; F L[桤s+aS|anF+u#v/=3`}hq p7ͺEޡSi#;_eQ~fqwvN yzq?SWfC; ofbp{g3W> g܈N:DBK٨I#CA~Tg@' úq{I90hsi <8jǼ|V]59;^jٿ0ӆasԿEèVwIvYūesE-.ˤ:Ld~JYu?.G8}=kX3}/Şy=a8$;Dz TKTxqyė?YE$iK K _Y`C7Dڽ}*I}+ 4XBo^n˰S/hadC8eІXnp8ǚ5z⢱>%0/Cn@( sE/+f[m;_ .گ8?+א<shs뫎3Ѝp|=h1eЪ mw)qg0_ͬ_TE~Bg3DR!Hgl#KA}DBDajri<,ϴ oc59@{4 XiF#R..QJ%7z#LJ1IT'֕5c&EB!G'yM>g -^utŤ_߾2JT7]GW2PB3m?o|vEibc$|dF 0 Çy'x\y9qtOYʐ N?۰6tPXU% Bh ~idGc|Sy 2(17HN{B$Y#:{ ɗj]z?ԆmYڸoXtd|:,mN Ax֮#0X-nTg~ =Pm,HHI/szlM0]\ȳoM/UhʏxLUxò/R2!潍jsk88H.ǹ)xp⌑ +*w~@+ JՌ%~+8hVOP*8[`9c i99뿿ѷyuBW>!#}e/~@ĕZj+t&)**19>3,}se=΃hc̜72U Wq<1~PFކGkeTLެxw)) p0]_pxطM o̚} Y:&OC#<vɿuib=?Ǔ>ˠx >(ef@]XdXH/V>C~@B}u^30;ȡn>gՉkP{7fvɚ@5*- H<\vt}Hs"a^~ PȦ\Y+l`%灘U7Ns-7hI'vwlvZNKQ_|3BȋS ~֣!pR.sW`9ASb6Q,P؈n*ߎ ?4yTό1&Ss$ h B5+% B =+]`Sh 9jZ^YzCȣoQ\lA:h5۔Zt8cГ~;J)ͻ jIqVe,:0aZ#V&7Bt8)Ljea2PFeTsbS ֢z{/72SVpn\Z p^ZG`u' 뙬f"Կ60y/Ҍ9laR̿yRU\ ^5 2.IP;M83Ae?WhJu? ?SIG߻Qg޺⾾! s ~&*Tk m2lwqiojiI4e"i&)FF|-E\;;8P)[х́ELpmС dXn>_%j N )ԡCmȧx/=<fuQ)(b3|^Fԭv0:&:TSyqvNfzu550G (AC/[G7Aůԝ]=J߻OG&7 _+^zF*bT,T}U}ܯbK"?PKN4d|NF A#*/1Z|@q bQIp_ɮ~I!K{qÊ7*Y{A7KOZ#:oNC_*\pB뫞q:/~1l}3Rq߃kɫ>Oj&$EXj6UQ,=wJ|>_r:bBUG; #iȥ*9S/SPO̹P|ϼo&1S@ۋ>tA̛z$yj:G'',I{ YT-;`-}m4"e|ӱ _{ƍ/{`.G&TPHʅk:|+"sKCi9dMZy;^%?I([\ >Zwj$$vG.h6w_vju? f.&ڧl*FM"S|&J~|셝>az*RcwVn^1o5iF20J\ü̈oh{,0 ώzDrrF%|~SG΀ |߈ !ccdz";:$6Im{OWSOr(6d@Q?OC<{ɮtEo{ίuzh3/uk+! X jC嚚WVQ6F K{]oש R-&Uq@D&o&ur1JU(B{{EoWi,rdc`\esÂȃR,Ex=V1лRQr3kި'Z>2XpA zq n%; ,⡛L+܋/X]0i9.ZtTw LM!{>=wLn$x6M i*  D۴`٩ױ<2P>_ {УUC>cNB0r_ckwlE"#[$) A!%Ub~g?bArD7cK4 n;]s<}OdR>jKwKEҜ+ G1W"I;kjE7?SeE HaBC%PuB6?LW3(Fd" ~#xI߅3o9=!lO.>Q̰)!XH1#9$1 PUooT=Eo(Lz4ŷc<4h4*'}/p:,N|sњvnU kJ3i{ QJOUߺsO8s}^kSh3pDiE2fBoz 䭁$ x:)?($DQ|՝p^ukފ,B"}};M^SDgmx0( krPğkZ_Au*>t<#hvv~~Y3疑 /1 ^.}Gޔ3xz<Ъ0!0.zyi]M=ӸWʏDr"mC_ttZa=Wϟ};gׇ;9zP9"ݽ.t'@Т]ު Lkw^G}lVɌr5[;FsSr2Vyw5x֫/$]<9QˇF,uu#Q8rk;wZsx7"N'Żat*iB1ʪ:KK;`I=V7]ycx|=)ȷd1]n:+~6GGP:N2R56,TpC/*+=΁rT^|9Ծ ~k\,bq8Y61Ⱥ 7_f(\'64e%Ndy2f¡xLet{<7~}bӌ8w8+sk̗ƸnBDzam-YXOʷZՎvc.ട4NO!hMd)C-Y!%5T.9`bQyS w :vu'|zi`Ǖf{Z^;W3cc1m-㴚DHdk \x=F(Z/N%_be'$D7^ef\ cÁ^#'>{QD# <ǰI?}W5B_c369| z$M}ArLN9ϫv9FPp-/*pDGEjQ,|DtD&(q떑U bV^Hs%grL5`@B:zgqZ{/gdN?$~x{Z| Ȍź3߷Ɩz]jbSH2gKٰ14nW%_v2r41hB7EK{qRJbG,A\Ba߶^iq m?ҵjFV8gN'uU:T WKгNGy% NJK5YR>TU_W..s>!P9~epFU\ @d#^+7? `*Dm9=3r=QI`=HU4VsxU"A"e9t֡эMIemJ'WchHxa.W*z#:rG ~: b(9EOS,?M+˃CV"\W/–ΟG4cy%y\3o/; J*b Ecøm>H OA2/ BNfI_aY|8RkƲ7QWiWTX[-V;*s5m\v5RPd6mص(,I0[ۨ97PA Ի0hP}/d'xH$ֈ '# 3@ ;q_{ ףa{$#;Տ@QV>W+lyaQ+XcVBm}pZR-#L27,ँd"W?X'顯b2Wlٚ7ZP緜; Fm~|1lf"YeKzյ9h+=JI1@K8Y]`z)xn,<';_V шm^?5̆'<ոeMg -3C:exKh_㌄ESA%[\uꞫe8QM" b#QK^%o>2J=2ufa2Z/(-R Ĕ]IN6, <~oUg {0eϷe>~W#v%^者?Td-jv4B7:~  m{EdXZn EgFmG]9B~F'a}\@4\rTø<ʏ+<8ʢ L[$ ==z+[!]B9#lSFoߜ`[$e6.o^9Iw-MR#I&'^˴U:zǧ*=p̼SbЖ,,Fx0:;. CWB?C>͠z4*A'cr_fuŔB_s9gXƿ_}dp]$oH9sL䷿*Q=;`݆֞&04͢ذ熯 pT.tב o%^hl,EjuB/=t Zji>  SU{pԻ91 󖲀|Edm'(  HVNbR&B x=r#5f{hՍW#]Ev-`Ld*[C&a͊4/`f }M$:ֿ-vʡh0q'ҙBpE9bnOB`,q;D9{qlczEF9;{OQ< X&PEWXhN>c*;FO/|/|` R+IRP`d ƐUz=o+ژFL'}gh'ywX;v :cyϸ[ۭ: I;Pm,-.4Au`ӱanF|gxhF l#|䛆g,F~,Jw!ZwTI,["@tKD?'N@<PX1uUU5| ,˹I|fq"p38.P@ɧ"$V2D &AFyj-eO@I叽MZvd՞ '$Y&#S?/oA>b^ڀVm5B5qA Kt[[]qͮW{ߜ.36gpQQ"PI!  =zO~6} w@+Usn*ƈ9*շZȄ׮ ;hL!xso`3-^wkB>~/ 1,y@ O.`תxR<F&':ze!sj>C͐ HuH\@^v/DMotI”aѧng>O5rҺJ8b F9@@h7dlgӁHȩAj0)1*s.[>7cL5dO1R;z{%t0O?|>>ӽdL!c^~ :1PG nzOδi߭WG 8U Ccyʇg2ÒŇ#нxKCǃǴ9'V_eF=ÛIG uBH;~: ?*E_[Wv{XGӦ"VQZ+S{߿$xY[O7z::~#yr%>AhhN;C*:1BC!-[۾HѫvGu#HY"`XP~~e.rbOk6 uh8n@IJ8fxεNY17u ߓuԊOjخGg<* =Њ",4){MmY74#z9}}s(Y UC$LSvd5?aն{9K#d ǨNw6TFJ&FDEcU\^pP2fQj䲨S>h4ډ8FwYcuݧ4j3txBLDfM'ax],~8q^|v54 'LO;L$p瑘 pa0,n#LJMzzǡy;!j"6vVP'։YCYOI^|UF&j܃a1T)_2~ oQh}>!ϱ M q3]gƧd}8Lpb0  %<|\zvC)$tQ/PRwZP}xEXn +^Qi<-ӄGGzt8rき >ez W#).Ԏ*.p}!uMN W\ȟ̭& O"-bEq1 X mbJC4wr>-~ .b IAiZ Rc$Dt$(z|%?'_^ZwHoO}.sm^6zW/]p @ :la*uWRڝBog&T@~2;U]β0.(E2+.B/KY*VXJsn-0[-*fC y1~LL/> Qp 1{L(>V(mqc bD J|K Wr;щp~~g@E_'e^f[m fٿ6wHuޟCbc_ӫj7v[ʢˡ alf ٯB&sx5n2apKx\#"-wVw:UvX( m 7tkI#D21v+~9 s"I$z fΏaK[|MfD9az."mO.뤫7'At YRW rx%% wf `wJm̩1~98_D{C3x=?/tyn3So5C:Ov%Ƅ풒wߛu~V>B|F!gJg'ڐ.p{5d93h'!~n&hO2#B o?obBT_? O o-|0y\zO0>/?Ͻ8NԖOztLJg G˷]|f |1}1"%-g/I+[.m;AMa^"AIqFr}mK?Xb|0kY-p.S+ZЗ-d`h{}LOfӫ_ 񏮿J %ß w> ZP+c2z`?R\[@|ɕ}S]98Kt`Rw\pp{h He'Nwe7q)<7";cC/dOVAl'_XH4a C1O&gWp&ҝ8W Q?,TL>OZDlQg|̛"Uʻ j佥 N[Q