summaryrefslogtreecommitdiff
path: root/drivers/bus/uniphier-system-bus.c
blob: 1e6e0269edcc18ed9f7c8e4cc65e6ce6595c8683 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
/*
 * Copyright (C) 2015 Masahiro Yamada <yamada.masahiro@socionext.com>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

#include <linux/io.h>
#include <linux/log2.h>
#include <linux/module.h>
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/of_platform.h>
#include <linux/platform_device.h>

/* System Bus Controller registers */
#define UNIPHIER_SBC_BASE	0x100	/* base address of bank0 space */
#define    UNIPHIER_SBC_BASE_BE		BIT(0)	/* bank_enable */
#define UNIPHIER_SBC_CTRL0	0x200	/* timing parameter 0 of bank0 */
#define UNIPHIER_SBC_CTRL1	0x204	/* timing parameter 1 of bank0 */
#define UNIPHIER_SBC_CTRL2	0x208	/* timing parameter 2 of bank0 */
#define UNIPHIER_SBC_CTRL3	0x20c	/* timing parameter 3 of bank0 */
#define UNIPHIER_SBC_CTRL4	0x300	/* timing parameter 4 of bank0 */

#define UNIPHIER_SBC_STRIDE	0x10	/* register stride to next bank */
#define UNIPHIER_SBC_NR_BANKS	8	/* number of banks (chip select) */
#define UNIPHIER_SBC_BASE_DUMMY	0xffffffff	/* data to squash bank 0, 1 */

struct uniphier_system_bus_bank {
	u32 base;
	u32 end;
};

struct uniphier_system_bus_priv {
	struct device *dev;
	void __iomem *membase;
	struct uniphier_system_bus_bank bank[UNIPHIER_SBC_NR_BANKS];
};

static int uniphier_system_bus_add_bank(struct uniphier_system_bus_priv *priv,
					int bank, u32 addr, u64 paddr, u32 size)
{
	u64 end, mask;

	dev_dbg(priv->dev,
		"range found: bank = %d, addr = %08x, paddr = %08llx, size = %08x\n",
		bank, addr, paddr, size);

	if (bank >= ARRAY_SIZE(priv->bank)) {
		dev_err(priv->dev, "unsupported bank number %d\n", bank);
		return -EINVAL;
	}

	if (priv->bank[bank].base || priv->bank[bank].end) {
		dev_err(priv->dev,
			"range for bank %d has already been specified\n", bank);
		return -EINVAL;
	}

	if (paddr > U32_MAX) {
		dev_err(priv->dev, "base address %llx is too high\n", paddr);
		return -EINVAL;
	}

	end = paddr + size;

	if (addr > paddr) {
		dev_err(priv->dev,
			"base %08x cannot be mapped to %08llx of parent\n",
			addr, paddr);
		return -EINVAL;
	}
	paddr -= addr;

	paddr = round_down(paddr, 0x00020000);
	end = round_up(end, 0x00020000);

	if (end > U32_MAX) {
		dev_err(priv->dev, "end address %08llx is too high\n", end);
		return -EINVAL;
	}
	mask = paddr ^ (end - 1);
	mask = roundup_pow_of_two(mask);

	paddr = round_down(paddr, mask);
	end = round_up(end, mask);

	priv->bank[bank].base = paddr;
	priv->bank[bank].end = end;

	dev_dbg(priv->dev, "range added: bank = %d, addr = %08x, end = %08x\n",
		bank, priv->bank[bank].base, priv->bank[bank].end);

	return 0;
}

static int uniphier_system_bus_check_overlap(
				const struct uniphier_system_bus_priv *priv)
{
	int i, j;

	for (i = 0; i < ARRAY_SIZE(priv->bank); i++) {
		for (j = i + 1; j < ARRAY_SIZE(priv->bank); j++) {
			if (priv->bank[i].end > priv->bank[j].base &&
			    priv->bank[i].base < priv->bank[j].end) {
				dev_err(priv->dev,
					"region overlap between bank%d and bank%d\n",
					i, j);
				return -EINVAL;
			}
		}
	}

	return 0;
}

static void uniphier_system_bus_check_boot_swap(
					struct uniphier_system_bus_priv *priv)
{
	void __iomem *base_reg = priv->membase + UNIPHIER_SBC_BASE;
	int is_swapped;

	is_swapped = !(readl(base_reg) & UNIPHIER_SBC_BASE_BE);

	dev_dbg(priv->dev, "Boot Swap: %s\n", is_swapped ? "on" : "off");

	/*
	 * If BOOT_SWAP was asserted on power-on-reset, the CS0 and CS1 are
	 * swapped.  In this case, bank0 and bank1 should be swapped as well.
	 */
	if (is_swapped)
		swap(priv->bank[0], priv->bank[1]);
}

static void uniphier_system_bus_set_reg(
				const struct uniphier_system_bus_priv *priv)
{
	void __iomem *base_reg = priv->membase + UNIPHIER_SBC_BASE;
	u32 base, end, mask, val;
	int i;

	for (i = 0; i < ARRAY_SIZE(priv->bank); i++) {
		base = priv->bank[i].base;
		end = priv->bank[i].end;

		if (base == end) {
			/*
			 * If SBC_BASE0 or SBC_BASE1 is set to zero, the access
			 * to anywhere in the system bus space is routed to
			 * bank 0 (if boot swap if off) or bank 1 (if boot swap
			 * if on).  It means that CPUs cannot get access to
			 * bank 2 or later.  In other words, bank 0/1 cannot
			 * be disabled even if its bank_enable bits is cleared.
			 * This seems odd, but it is how this hardware goes.
			 * As a workaround, dummy data (0xffffffff) should be
			 * set when the bank 0/1 is unused.  As for bank 2 and
			 * later, they can be simply disable by clearing the
			 * bank_enable bit.
			 */
			if (i < 2)
				val = UNIPHIER_SBC_BASE_DUMMY;
			else
				val = 0;
		} else {
			mask = base ^ (end - 1);

			val = base & 0xfffe0000;
			val |= (~mask >> 16) & 0xfffe;
			val |= UNIPHIER_SBC_BASE_BE;
		}
		dev_dbg(priv->dev, "SBC_BASE[%d] = 0x%08x\n", i, val);

		writel(val, base_reg + UNIPHIER_SBC_STRIDE * i);
	}
}

static int uniphier_system_bus_probe(struct platform_device *pdev)
{
	struct device *dev = &pdev->dev;
	struct uniphier_system_bus_priv *priv;
	struct resource *regs;
	const __be32 *ranges;
	u32 cells, addr, size;
	u64 paddr;
	int pna, bank, rlen, rone, ret;

	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
	if (!priv)
		return -ENOMEM;

	regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
	priv->membase = devm_ioremap_resource(dev, regs);
	if (IS_ERR(priv->membase))
		return PTR_ERR(priv->membase);

	priv->dev = dev;

	pna = of_n_addr_cells(dev->of_node);

	ret = of_property_read_u32(dev->of_node, "#address-cells", &cells);
	if (ret) {
		dev_err(dev, "failed to get #address-cells\n");
		return ret;
	}
	if (cells != 2) {
		dev_err(dev, "#address-cells must be 2\n");
		return -EINVAL;
	}

	ret = of_property_read_u32(dev->of_node, "#size-cells", &cells);
	if (ret) {
		dev_err(dev, "failed to get #size-cells\n");
		return ret;
	}
	if (cells != 1) {
		dev_err(dev, "#size-cells must be 1\n");
		return -EINVAL;
	}

	ranges = of_get_property(dev->of_node, "ranges", &rlen);
	if (!ranges) {
		dev_err(dev, "failed to get ranges property\n");
		return -ENOENT;
	}

	rlen /= sizeof(*ranges);
	rone = pna + 2;

	for (; rlen >= rone; rlen -= rone) {
		bank = be32_to_cpup(ranges++);
		addr = be32_to_cpup(ranges++);
		paddr = of_translate_address(dev->of_node, ranges);
		if (paddr == OF_BAD_ADDR)
			return -EINVAL;
		ranges += pna;
		size = be32_to_cpup(ranges++);

		ret = uniphier_system_bus_add_bank(priv, bank, addr,
						   paddr, size);
		if (ret)
			return ret;
	}

	ret = uniphier_system_bus_check_overlap(priv);
	if (ret)
		return ret;

	uniphier_system_bus_check_boot_swap(priv);

	uniphier_system_bus_set_reg(priv);

	/* Now, the bus is configured.  Populate platform_devices below it */
	return of_platform_default_populate(dev->of_node, NULL, dev);
}

static const struct of_device_id uniphier_system_bus_match[] = {
	{ .compatible = "socionext,uniphier-system-bus" },
	{ /* sentinel */ }
};
MODULE_DEVICE_TABLE(of, uniphier_system_bus_match);

static struct platform_driver uniphier_system_bus_driver = {
	.probe		= uniphier_system_bus_probe,
	.driver = {
		.name	= "uniphier-system-bus",
		.of_match_table = uniphier_system_bus_match,
	},
};
module_platform_driver(uniphier_system_bus_driver);

MODULE_AUTHOR("Masahiro Yamada <yamada.masahiro@socionext.com>");
MODULE_DESCRIPTION("UniPhier System Bus driver");
MODULE_LICENSE("GPL");
,: imWxg%W6MXK0:ڨv?=jOpGX;[w: ״RN@b{4S4@Rz: ~|')oHM$3w؝Mzv_N _T E(t(/J @lX"b{A37v13vr^Po &?Ylv!>PSaש|Cyg}@qjB g MF?qb2ks׀SpX >ʔȡJs 4#[-[)v/>@dvH߫S87k`>.7Gf /=\o0bY.prlD}zZ{pQoJ! H=Ʋo냃pz$(x֔nT_&n|+v/ ҈pۜQ\EcDpj&hʕQLC>o}CPx_;\ٴ%׸:u`|4n`ct; YOFӀ] mIuee=Z[E\)MlNNKc"4Oͼ>m@Dkˍpr0czp]Q  qՈ3 Ne~=+|lҡo=:vT#fRD tT]T8=&Vlgsʑ(ct'PA꽨S zd|Xu2^k>׈KQ &0T=RmvXЯϒB9tZjr <-9? M]Cg7QX_;rj• {~m5}ݍ퍆6?XQh/auۏ{0בah;gO~> q  JQr X`!P puUT}vZ&/v'|B1 $A<]q:#ATg{]k݊;c1_I2RPRHB ] oqS`{alPos\ȫ~+_VC}j7Gmw{ϋƶA+WF߀[nfd]^r)MK _p=V.4Txl?s_GX^g? Z/_%!KǖlPu5q2 v`P'7ݾsx>[%\qU?=)F֏p11(:xisHp(O~ǝzkpd7rql듷c(yK-F•aT.Xp Z6yՏdU%p2 F$JLњdL#=(z uW `AAz")KWt| LvCz^$Q%Gbwn kׯ. ׆)0Z64ۭz>61o_"$7J"?pJ]A:F1.'X7\6̨ sCߘNs4 .5CeS4o@+? Ԣ+=@x(?Nmqf ?5!fվQjy蕓}]V6E[.rH5aw]hNrD` :NOty1SZ H+3#9zcGWO@m$= lgVAhN5=o%9K4BTK{-D&Ἃz /z֣DCxh''z[&]n}V ۉP}'k-m{Xə͗^GSO.1֙T.Y#nNgtM:lPrftᢾ/#oVog^l]wbBvrPCot os=*IX3Ƅl6nf=<;2o0t57XL۶9<jU EHT_%V&b-aLk8JaHI5`dr jXFu'hV t19KqUS|L=G8' +!0͕O wxBc-!tADA&£\c-E;h{@`F?;rXP0ǜfw ΞD`s'iFqKTľISȈw@xBI<6v99BDp_ݠrrYȍư( eoq00,q瘻kqAA8 Ҁb^E4hq]aTj`@љ5m.qx-iD>{|nQ9(a`&{컍2\}%jΫ"s': lxW#c>+,BD7 `uԵpS2u u/#~sNX@sPHXG5 !c9?)&σxF%\IL4hHEPU"#ڐԾ}q A(ۜA`  @Awĸ0TxI/UtfW Ԍʧ^%s澲.qGi 45jS\2=G!zk0Pwh9Oxg>n|-Ǵ_o.}mۦ oS1^!`d od^AV/Gt*a4!8.G!_%yv6F3ljdۅYYeqvG) Qg,(ח礭{QG)*[!+{:_ET/cFZcX&F%et M祲p˦W9]erȉ{i*@0ڴP14 ,&ȑ>Euʀ\}k49|b EW y*?w(W%Dk~&;l> @u,l}}!Aգ˼\\17FFhu_A,#,H=ڔ^o@=y?뭷?~:p-իݍK|0#%K,@i^ `570v%M9u! VlSC3Mr4 lQm6;yY~=l>_Vov}m*`v Sjt!`cƆ4 d8w!Ì0J5I`>U n glJ4kippn&&?8Lⷶx`gϚro6Y_9_V`x$2a.û$Q;awU,o$I  yX_5C%!{֜'2jwwSE2]O)M69H5L{Fj0뷸@O¿_%hqm.D K(!N$#p8\q@`?H؂_})Mp]]y TeN0I-_ .ȀXl sàM2 /TUGע;"/.`Kع:y:dG>B_@Sru熑躑q7 B_Me5N N @"@$0M1")5i x- ukM0X)GvLGP\B/Mr?'P#Ȁr<_nrn.:p749clؖć*nrSo#22C9O0I2q#U(&?3UC&۔l %9[ (/eZ`]]D-ވ/3EUcP̄?zoI"dm.A: ׄ6Yl}ա嶟ouC-n{0qns SC1U@"7ԅ:0}}ew)Jw8+rk+.)uzfݵ[Ŷog rb˚ CA2V+$fYl9ڗ E=k$2 # a^Z k&1S. C4B#hlY2ğ`imM( Һ!w0鎑驩QnݸkW[MZHy [ 8#5nkɓWRUw3~wMkE!ƐmA@K U@Tn U{<> j{F\qs#RpRǿP^QtA݋&9$^xA {Y'o= s{ؖH(p,5df61AӽFo m,^]NjFجw;{eDMPcѣO˯e\Svc V `kirld 8xYM:>\Eso] upeUo꥓Fu$jL30P2d/UkP{)aC+TBVߋ*螴&cj47Rp~wPG{a&iz ZzĔi$R o+hdɓdsȨpKd~~ ^>/e>ˆ?AQ֨j:Ip1L)h=V C Um+ [%OZE8wrnzfTN'qG=lCe|!mx0oN1!sa4DAdFߦV*W [&b1}g "[zEIkH &I۪elq>2cPKPmБW۴wfyז6Or{9\8L9{gLXhZ LOǗD Qrأ2y6%RYB:ת'!\BIW,`çJG%3];YVV&}C3?lPƗCm>@e#OĘ?py/Q5+1aҰ7wKTJ*A)WX_rG!3E5HgA;Yŝxνs@5Pe+>y/aid!Lj\ҁ> b0#Ch3 ~`VCkEx2%4s|u8U\Fd}էud9"7Z!+NqT3ǖ>@AA\ TwHsv'u-?✙ b=PW?q䍏_ #ÝmU^#f" 7x }dw_ss1cFoκ )42í v8Jy C: Ɩtm]Vzt 6a#ᛃ$ }?_{ 7UE^"\؜JT~HcRc+yQZ-Ph 7ζXP%:d)ecҮ4 !@J`:ZGQuR`%pQꉶd;oB@S$T;JiC2,@^I F2솧눴$KHI w-PQX8/=FNOjGOCG^GZ}C4BA.=[gs8Ubu_Dھ9ѧ^!IʗpnTӜf5V qpvCjRI^, lq 6l / =67:¢: |I|/u欺{ՏNY͟vTNK[N%v[,4Wk{/^}[Vu[SJVL>wmM:mv4E] q?xоg}׫s?+8UΖ{_ti݁^ hvQ$Yc9Ko@7.ǻFNTO/o< 4vrP;; B!j2%Bۦ:}znZj`b/'fMmC?e rL87R_d^GgOay5wnw]}zvV?c7Suwu-7,f:rJ aza -'9O±.3x-;-7gMo5QP4uz\=R lR+~l4 ^l@Q5"]92=S*tfaʪ5"2W@(v|dUmKx[T)3@7 BjT9L YD|ab_8MEZGEQvJ=_w=sXʉPhq<%"IDo#~㈃F=JO~㨂({i1: mtpn a5iJ7a,s`Kpuj=_fLX/ʨU$bX+z2ҧ7!RSnoٞ嚪${ =Uu\e*)SPnXc{/uC GT4ԐOǺus{'swlmaI`HBEB4"![*2ƒhNiD^#|  5m95 -% )Ut;Cޣ] w NZ#ോ#Z[@F\0ʽwtwR(M )[%FjlG~*js-]wD۟)/KDߨBl!5@'*;f(0v,_ \~ HƝ  IM T6/3ڵ#/`z4|ẘO6|Ƀ_%3Puۼfb[~bӔT{O!,7Q@iL]O,^$߇Ll`7OSx-CM̲k1]\s%P5NF ͙AC܃C(/ Qa{0`mWp#>|F(%)Hu6W֦sWcM"'Ѹ薘{gK<,}  JN wNuR>IsQ^p^th5nsMޥFo] Dr05dVs瓣w/sb>;V" ZI^Aa˺_g5K*N"<#9fnm%P !櫐_G۸cluu0BWYZkh@z9&(U=7_8q{.lVǁ{lbv"<t1;ǙLY + ; zWÈ̾z PJza8$;/<6z@'Tf^bUﭞr?!p)B۴>AYvB `A H$Xi+Upg A3'C}q`*%;_łH9l*c)IqV/]}_ 0DoU|̲ "S ;#A3/((^amx,Ѱp'.TJΘoDu:˄_U`K̍'/z 9H)'0g$cZ5wj61U /i-T,Fq@Trd"l9V;}l,N  @|);_Uyyu>s<T՞>FCFc->c0ɗkͩ7tNsat>v< <+nr(PtW0qajs>I[vI9-ԋnb=gH!Qr%J9rF ت냷*$#Tvn2{ 2V<ݑGfE6VsV+tpoQK`P&W0"~[\svߑF)xDKĠ<0heB>_\O|+ ;͏C$애jε =].-d9MD÷&]wOeǚs3usso&G^"zZ =i0F^=d8[ny='XC񜑨iAf >@(EAP)t|ӻA^&ϗ[v9a&Ibzߣìc ee)bu`ʩxܺ >r:=n;y6wF^˫єޯB?8KeAU]5`.I}w#"oK!珹VWBS? s4@[`V?ڐVGAsr2/;W $0(^ӌٺ1gHKϔ=tj M]S-atCb^-c}4cY"w >F⣃L]Lfpb|=Ӛq u1O0t2IDyt-2uAfV~ʳCHA?i|qD% _HÛ4r|D#3ߟZ`)"у }\ȿ]= >g*ytzq\Hk顠__aB@ؗCD圍~,J qΡ"(0 Gy\6P3[p\K`2'a%lxD=:9_}C& ө0cŒT(.__5[r`P5K6zM[pQVQ1DF՜_*H3|n'3NޠHdOX?׌SZSG 0-vs׼ Z?)?u˖`{'F!Af! D%9#hy?q̳îIGs,)]t,M{rjH[hg@,K36И+髃im3 |0p W#`N Tw=i#{pO 9(SN#'z֗vx馯n89x%CɢU"5ݎ hW=GTP%YRAMK9Uh;y)Bv@l-f :b'UBt<rz7R\nop*w6u U$s*w{U ?XQGbCe{ri-,_\(8|kZL07Ja -R}Q#/hN^.wR| t^8WH6Y#F 6l5cV5lXl?OK\1E s%YYRƪy(CO,u PJ%uG6 5hg5ϱ2w(8c >+γޢK Nal/y 2Ί$56@}( VAX.#e ZgiN^3m}/wIE{[1r c9HD|&𪜺:@ZH@N[!LR\pYB 2F{?ސlW0jg(s+V *7*up"`Tb/ö`v!^zSg)X?R!tq?):~9_~xG9/& `5^>-Q)CF3.%LUW";x}/W֖-Fn4!"{yڡ@yss;<1+lU. 5@sz+?Gud*U9r4CFp> 8mT'<;:ڜe 30_׈ec+XZfP%t]7_ؠ*8$&n[]p|WїFzwS%>[)ɹ0e[_ liK*̧tϭDk{ .M];':upŤqz_E8 \I%EH'>nnTF@}柣 _$RML ß0,c$LdEĄ dLW@.sETzL8_pA 75-Ͷm MYL?jLr2̝m@nzC6#ML}j dh v0on} kuR^Хi}}&djc@M5i@sHU# }+ǮaѨPд; ]t" wP޽ý^srM0% n@xϷ0 Hd3"} -:Q^;<$h=)={^X!#^r󹀀P>hJJ ͺ=pCt%.ཷ?oç.ksJ蒕}$L@]i_" ;6/ѱ1L#P^nö}"x{V:w2@gSOYYt ?A`qbAfo 4\\8N^G(nت) =7HsƇ(ó/ǓDQ8\V @ߣnyrfo%,wAR;$\N VB6qܴ5@ rRI|=nf۔4:eNqr̠ }+7QnGeKW+{Am@z}i&sW{R3g $ @uћ,T9}nKlZp#yUȎ?V~t}0K^77NWGZs[=op\laW* (S5lԭ7UG9ּ;y/Š<03@DZ '9~#q@"Pj~xYےA-(PH_?boY J lр~|n )F-Ќ?,0 98447?;b(n-Y)6a5*n7IEsc5QտTwlxJgusrX-0RHI%4*י !bٷG֋,4tvpJN."Xpk~ ˣ#[}-ޥc^JځI[B Җyk/i̴k;|u6u;.3@Ø4.5>{ }ȐH!fkOwqqwD9-Vàש֟lcz)U$Mػɘu3zGu@ òy eEĂg쟑dK "e)Y$5D^̆b`e2F7ڢ5w\!ښ3V a^il\țUѦbͦ R,,HsCa˦ݡFDs-LnrA^Zᴂ1搁s+[\8Wx$c(GKqSFU0kADlIƽȆGJ|֊μO A{8C^0fq|fdSΆl(o PȁYkU!ix6:[=pL+kQlcݝy! IE? }4wDG"5H(g٩aP\c:`)@gM#'ܜ'~ŰBXLk! Y꛱k]>MdqFp4JizΙ^\$2B.E_J]TZ}rHqpnL`hdŸG) bb$rccMPQqfgrf] MKDrΡ@a U:?,*0~JB%T P 9Q8gp:kA,]X762&`%,g:֋|#A7$U|WiLjg k2ި\ո F]T%^T `8 LrLh02cֵ!s-sLc…".ub8ֽ$5NFpւHiB5뿍]>P},4F<χaMz\8F8Îf FWrYI"rFHJ?NHDOļ B8.SAgZ+ cI{Elvmi Nój4G"a@N`$q 6QʺWMPa9G 0%O6=׮>PЧO4C$ |6KD,]Umar3: tme*1 +`zQ nmF]ou*1AFT@5XHV$لuTþxo'th|σ+2D'c3S=Oa]iI.Ș"Nz%bi {(qOJ3/^sаLA_^'"32p+*b،ճu>E Q-9zשȼG}_E6F$:y(& ŕڶtaE_mۤ`a;f `R$8D 5j  Rix*H-ײRBU`p+pШ(v+>Uuɚ~醌O\iAh_~k-`Pׅ oQ9w~_\RV}3-W*[193?!b-#I:-MmŨmC_S :L>SK1Z`)q> -!W1 72C?ל1 `(t;ZHE~THögD&*eGD<,~ؿia dAUbTjgKݛyiu 3FY:^WA?fcT4[Ap;Z۴Z}NG(]ʜvLHV6 gYYt؍ݔ}ICpvG#n%|{+ܩ(X`ҎŵAQf @Pjf" P+)^*kX/ʮ` XűYhaa Pg9ωM*h HHR!I׏7W9f nׄC?|,YnnT'Xsq2_wyCW.H&-mAg&*K~$ޜV?it6 ex]/ 3t2$vN(=ho۬pŦ{/W }ݛisܺJ \j^ٱ`l]`Ortkw=幨QnQ`P5zi=[ו׽w!qhP8N8.`d @dc 0sF25-^#Q6xLjύ1H;4ϏQ xz_v!0ed^_K>4ƪ<>+,N2Xb m@{ˢGftĶB$E0!A8*xG0~1Hq<} 2 pFx+xGPK>@ڰW @b,D}c 7>?D -W93bQwf+(AC{jȬ,xXVEOæR4Jj/|!σzB:-x( 5Ƞx#. ju.[sf"q9LG>T2xK}on֞]]= C{!}̇c/sXA>4(ljH/E(J# qv`VF̓թYX 09Gh4t5[`!YH o\,Gӫ]Ume`K%/YF&>Gt0լwroA7x1tX|6{B᠞lb@/&Vp oک'B3GSAFrEX?C=w4[J2S!X\/^:h8buK1CF!4UfSok ;tb>%=iz E`/{qxW dRtr >K n]ơDlLk`,8‘<=J(ŀ]W=рq"ɯ-nj$am l0z$THQ7Aޣ*V-fFH5j5]{t7 :sY҃%n7)&@r}6.>g_v3,2ft4{Mr='Bb0I>Pl,V] l\7Z|`ꢍAxVMx_d:NpCG)מVs|;L QOh&xᜄH"uL*GV==紸JZW6z,%NLcz-ힲ:A Ow4L.JlG=]TxQ`^AׯG5ZdqLPA$$̒_~غe ȏ%HPM^տ!Mz9mJ4̄$L8~ߪ9]zv8gcП3Ǘtu˄  ʷ"RG`"H|dQnvTe3q![W]e.`"+2 Sx% sUT:1%6iLw,cL t?0z5Zz)Պ8%݆jh*s΂lףo/99,Bqha%f^kMXND\) pD $ i̘wF^t_0va`< 3יA䎢GD#0*8ᇨpvjU_sON0+Z0hI!/+AHrL[q{ȓ0#rfHS1po,pPC`MVyJ#!Sr6Fj~vW8ZF}/y -xNHR/`ҕҴǸэo[cv,"xrv|_Һ:3 c_]ÛE(EJpI8i 皏) 7lX6D&0d Ċ{"'hDZvo[8Im4TKȒ<GPb8^MRxAgU ](NkN84cI۩7"gꧡ&2&PeD|Hٙ3+~;N)?H˥az*̀W&H}ߟׁ\COζ"[/G`@⻖+H@<Z⸖r޼UZQb̨L/j(֮?aٺӼ~N570}kZ KwsKFib@r/r$V>oS9#eV3L66jl\bk7bL"&!.ǩ1; c`*( )cG# >~\1C\ 2YqČP_4\q7Y5U! F dM/'0L`87JY5Q3:I￝PO S$.5^])!υ/jS~L |f΋->;a(dŠjN"y7]9°* Rb1=_ ~cׇu.!::0NE*M #wCEQ:X SG` {$.JFv Xv) Xu(,ўK;г "wSFdPnfxC㗲JcZkR\B?M1qAKS@6g淮l[Iy+ynYp;U4jHr~7бT#J ϫR1=oC!5뚁dv^ 󺴑2ȡ6Yܗ֖i@n{ 3g 7V_WKp,,bź, 9Qt)`2-.('Z ٥%jpp߃#Rޮ};|*> z 8ۇۼAE6lŞϏPd܄)fQ ev\0׉hpg-;@RܝR˅`xV2o6]T\qxw1N91*PjP80,Q!'vArݎOO BM>{YաC("3"P[yzjsCZ r sP!`a, c>T}vB5*_'#^sa2U"y "q@lGPo2b/;' _ׯ!/摍^v4$>_BsN^0Ǯß8!gjo^~ n;]e$gp4& Ʋ hVjU,_nnwR"iAZ\uii8$i!X,߱kE=Êw}#Hǯ?@ga"3^e T݌t6`8e Pq|s8 Ǧ?MŁla n9oū5v޼@L1(}oF)s-ɀhn+~T[(-& _D .Č6oM\NnH,0pmpS54&ydm`F!Am#͟2EfL68Q@;¯d,c`C mmzlbbys7ߩ,́C$(7CQ]'ǽ rQJ祈%nR;Gjy΋! +|MxakW:^أ,cϛį6CUC 2v *)säh /+GˬG UIJ 1Wwls enk+[pV&T!) rlL nAQ{[ a^U_OeA)[;=G?F:(QlA4:R@MuZ}uB"rn烝z{[eW^ܛRQC*J/BquZjq ,HQ Ph!ds|/!PA!Dy'VHKQ6|eCh TQ;Q0H[甤^` %~ uSEf0] 3TuFxz52[ɌB~c0tكMņ:*m2}ߧ+x~9<k{1T}Y߶zHV;8]s 4r_K/v c|lB:nfZ-;S=oui!qF-^Z|#զHp"Oj:p]'SՋ5Y^BF i MzX:LĔcv?!GD3?c b |D<5->z:I BN(_S{uD o7lx,[X<<(. L‹4ŷN4'vBHUe#,^&XPꄃ_g3#VAuhB p|͸<:f%R'V3l-jP>t.aaLj7Scdn7\Caυ[! `*,Fd;bm%}QKip6&`3\z*+bQG0s%6CP z(1$d}hƒ"2B9C|$y͸.X\,# 8ӌCeWPqn\jc֥92v~wǏvmuFYX/S [MqXAXXg%sMXΝ8ў&ZoLָ4}=O|6CN~"̦%GN 6 xx]~.\\|vYw6+`< W ~ntQC,tf~ϋx^#c]!6x{5wbE wٙOot(69`Ɛ/aE)E ҳ Ju&bf) iYC Aa $"hmRYD Z%C=xZM5g^K3C'b $xe>ygۡ=:}#pa9?˓?6Ie"Êg/g߁ޖ, ,NItb0rDF^9}O\ç} {KlDT9HI j-X'GC ː}jwшw]Q-7l!E!w|7\9N\v+tRbր@tGIxV_ddᨌgf^˯oWwϳ^BgzYp{ZS"߯qw>_j7f9{bH T(T( W~/7&!/(G`P{? IDk2?=]r}u/;eٝhQ~^v(d麳OAAP_`| 7s?Qq'u9yPz%IEå"#Ӧê+Ԭd/o)B?5^4 $Eo^?2=:_}Ъ.ֆoK|`~D r 5"Gi*hA@ !J@r@=@hM+ \ri@? H4'.MÕN:ҏ(HiՈe@@C$<4 WDNl+~ z _Cg9?]Idp &i 3{/Gd<[/).#x3}P8D6ϧӶ>yl/U?/_X^9}.~?4s^:5> %J Jf3*WL/G7[(pU|fv|:A|l8^L R`~^|} C gǙG(?) $&a'|-?~a@l @~r>*M2C2|[OFKmGES_0l_Dp|'e 8ssPaіofKXv0}hw}+LC7RD O3)4ˢgvüJ,&ūy1m?ï7yzy0qλb<wQmwѻՎ !k#|}?X|н}=?Óc#9z;huށ+-Y.wYe=Cž_&vy+z<{ߒ0& bl80"헧Mzefq_NY^S[+ `XspxpoT<v{ ݫoSďM]V|/pHK=r! O.{?Soǹ,?'=EG*eSaPЎ\WtOn69c/H}@u5q.?5p6F?p쟔aQhAG_r&?m,mMc(P:\-r :ZவF@HW4m}6[Wϵ?F<?ﺽ09\!\oNd#5LzD4|N`IxRAڊMyydδ㱽<>LxΜ>}˺_(2LJhogggPc4Xo7m_;>X#|^Wg8ͥWO`kj :;~]m7oVb?ofM#&Aj'cxzJz˺# npvgz:{4|yѵ'fYi|6vnoAZh۰$jdyP+a1׷|=?wB>GƹaV|ljU%>@uW{k9{vYs$m Kw%̈́ƃVu#Z9qH!9ڶ2;VbmI|a?F뵽3?v?5$:DL} Kg.rqTR{uVYbOy/>_Kӱgf@KfuGO䝈-CN#| { ٹΝ$WzUڷQGe9"B`"/Yӯ'~-ŒpR9;G(@grMt*N_"\G够b8}ZP{M!-9-9=jρ4+']`}P5.P{Yt[na}F/m/"-5e|^5R,6PRA>CcXeH29+G28Fڽ=2PVê qHrBN3z#TȻ!=vn: aQm>/1#n.As/SMosB[BN NI BA%(0ƦhgY*H&V# ECyAKu.u.ao^KG E L ` 6_̨JljE)@K D%[˃$tiPQ }T%}8P*epZvhg[i`F.IvlܯPΰ^P}}/'_3ĉn.~_ SO6 2׿m>pjQ%+~6 33s,&:}cw7?8|N6{AX ůo068DX .@",0N&6biN03B3qCO~ `90 AÖWPz!t%U=wKmj@o'M#'['@n]9li(_EvGp i ǢvEB%F#e>=_/n~'n=[5 B'rD"vSzLFVd(XGl޾EAo)PbȰpkUiGѐt.mJW/M`.jN@d*Z#gp(|ïʨg- 3m?IկsAG0C97_W9q\8ShP{&6N`3AI ĸ[jKW(=m<XQ# wCW&: 2MK";Fj{ֹJ?}}5S%2jq(I6q`>yy!%kta܉^q};{φA^H%ٙ5;T@(wqf) zD reԂ:^&,c M{^ XBZ;") 'ҘӈWiڣ(XI a4Gx&&TRCu@M#X 1RZlDAwbK7⳻BL5۲'+nꁢ,DA3]"uɠO%(#4_Z7Q"g}L;N~雅s΃q~n8&5콴xw] 9""+Yt[NN(#TI1ȑ8,A-9?[ d5 PFRʬ^sY-Tun`̚\챯KFܝb;Ojڽ;6Bz7/w~.y紐v;1 =!5oj+O;;`Z:5=` ,L\J6g~ñD'YPꖽ9eW LՋe=1X[8),XtDq$,K-sY K'D l25ds w'1Rad!Ȳ󭒣L)mo],oǨ)b u;|=s!q!! ĉ7?p#_Ӽm8.{*v!`kӻmRТG!H3v 8 ZJC Mf`mo[2};ڭ]-q.=2W*e1H<]ϵՀ|֎p*G) "Sn:#*c}n1kZ$o]7H;G1RԄIP>j8⽹p~yWZ0%w풳cg;Mη?NnÞq2aUBr5V$B#8˶]R hU{OTm~nFslhtJ! 涛D}>VPްyS+U덪H87c,~!'W㦼\DDQ#$o*㢖2H8qR^8.K!5UEʥ-ɷqI=mdE%k=]d5Xlɝ!-H.(dJ,U 5h.ϖ9ص7c E h=Og&" DO@;cBո\O<q8CNhs[AK׷6>m Z}[?*f\LV~vZ%*LG` Y!Oζ6-(Wo+TZCM/s_kR?YƐWNEŕz ,8-ҝ[K\x/}zVS "m!SGtj:R%n\l(&@TO(}WҎe_ptenZ$X : a(YHT~J,G4 C%/涾$|6}6xQLtTRk󽋹$aWk=L]ˈצ%O\VgEa}+d.aSW˪7=M'&(|aYA'P*_AL xH_I!h1 Ntd֙pfMʬ2>UFTC*Tg(!.^,!Օlk~^60cQϊ6W4C=1z77p&)~A(yJ UJoW>ks3 }+@{]2+:_*:W%aúyn - x?hGFs!pM7cg'}<{@U&W'C'0zt ?eq pՃE4!T<;eTc(i*7<>8U[vj5$>$7ǝ0$ďJZ' 4}X(*y֨asFt48.SUc6E* *oە|s:KY>ś zÜ"O}Mt9+6 zG5U6ܚW"ق.8潹X^DUg({0%~O9W,XT4®NGX#J H#_tnPi^s &ff᠂~C ܣ4E~6&ZxPbk3mU%zwfB&MMZMVF78?Ѐ 38=a}k))P$FW@<-J=łWZ8$ϫW} ”% +lcH@0[j\:hF0B&23`gn4b^#}4q( `ЕH%Ci]yEtNnd(H7;L5XbHh*R p绽E@i@'H >AF?CaAZ~g0?)=mukOwcj d {uv DK4{F?`UO*l6<1HXxbQиVꚢkciy{YD,ך-.\.xsPjj~v kp~E=)sԑx$4U8ĽD`O9z'[sr4i7?.+jy"֟^;Q\05 (tdۉ8X'L.֨@kSb<\˕85G}_y4;HE3t='b̧oCS'γN,b&t/T˫k\Q\D⹦;Y4v IJ$B!5 d GyQi>8g[mHv_o|zbUx]b+9WF:#4+,0KgJxJ6ʩ0NCÏ\,0-QT 9*QQKk`2l@]LECEo[~[]`9E,K,p'n"" H-VDjxl8> "nvt=^ ^)k_)C.[xr1ݫGo<Xݢnl%$ua0H 579 ߛ;FCI@N1gtaD yk#.,/(Av}v}{dZiJ" ڳs~_ !׮|usopt`Y`$$*L gL%kK 4$U˃Qtp`\uwQeBƳcogMw݃w ض<[$d]U2o5DD4CEi3 bq!&iGlZt |tkɾes1 "o9u8{lx:8C!_>y {DLx]>_j} yI l'xK6Ti{LL %2edK{50QOv Mb陙ug{xgBL93n&ۃ7kGs"j5H_hh:llO&z^՘:o-Ro8iܔ $CdGcRC{jܲ=CC 1;B9F\E_p1 ۶)D( @: wyh-߈4Q9Fzێ^~oVfmvjFyl&=]yjõ9CLM-S;O[.slC]XjUCO XkFjez_U][-l2ts"H2B!V\= xݣm]v-Pue&Z-{BE&JlUu8;z68h#e'LfHpod쵅$xF`Gi%L0"!eT:_wu\tz؀F a tMԠf- `hSCd@@!AD# _tah>}몋wdSY憃X9Ah\¾N?ON*A?I|MSd6G@\駁+*'Al Pu~RO.nH%E@<ދ>f悌t93JNRYe[i *ƺ0z)Вi믅ԿI^N^|O`;OV|64+ýx&:<7>/Wg٠vzΔCſWZgR*·SM*- K(O/\IT@>o4hB0sA'30^m/:H6lbw ſ_g6xp繇OTn @ 8}`/!#6}{|6DxN61Od)w;(R@%A/21.gP!#11MIG100@f$eB{3ON|P*3aj i}(с>׺}:u7=Y:M4is+4p|%\[4χ.|=.l3͑EXA Պ9㒹?KzC1oӧI0i8 iM!M1QH29ও1͗@nj%UO^ `Ci$ rFH#pD1;?Pn zAtjwf A(d$=l,~#{K`)c mUmH5DV A_̃J ~yQÅmt/ 2J&J@*(j(j(Bh(h(*)j.L~׌SM6}gb#[@44&V+` 8J{!p@9|L'0ן$|m^:$(q␔7;0s׸o|rtSW;`a۬d%⛚̨Y_#PsHD#=MMii3_]js3je$GHT* AFa iBF"$a@Ѯ_#Ƣ$"I&I"I Z&"b"V~ ,hD$ B )É((*) ) BV&*@PDQ68忖P^vT ܘ$Ox!v=/_RvH(< eϕGD٩ۣj q9F {ܞހMDAu>c݂Puf[[;ębi:fX#UC_^M9r#A *\HEr9XQWI">h3kBiЈFs੩?KslPNajm{RYfMyA2LX6VU4!: &`ۦL57B@RMk5W{ TtrCbXr3[8&3@@׌,C57"j q t@H%bY) my@D"kE/O6 hWÖՉ'79WqwIc|  ̖CP1(*p'@$#ysNO 0n>7}{BwdM.\;#IhK WOO/0IˇpSԌO 2iF6 N3 T(y"<GG>>8=lI@(j&vv' x'>!8 ht QikVõD_Z>{d3 kg]IaPށ3~ű 8D|޵Q";f8ĎwB;4LLS<$Yu;ykhy[~'F.LCY+*P9e5Q34m>h*4ҌGϴ4u! |O/^zJt'R(܁,HY"28G@@786t<АRgRNe'0/B"OydܡOAϛųʏw,Oo󨴄-j?7,W _ws\~?MYij[亃m|\Y3,Vn 7O)un^edzg72.\9pݵifV׿on\?;|h]{:IUۚ|}oGN&CJ D EWt7c!* 6utBOpys' 5ƽ0зַR@e`NV g| NQf9m:Ł+"5n/*?8T3H]0l`@8c[ft/(mWٱG^{4ꤟwь?؟enU0?CfLCWPUyh"y"w·M #E-_CǰM]()Cl}lcX X{7Xu];u8ݒl[e88Afgi uõ`' b kT;3N8h< wG?̔8%=UE_Euڷ맱gˑz!l|*xm_݀`AT+kā?@3fgh,qD"ơO]gt@X(!GI|w=s /Z>:(q1$mQh(k4oypX''JF FQ'dwu^þDžW$ LPߑ^Ѱ7`۱/@Հy3zVCeM¼ˏ/O k~ URTBzI.Aoɝ=IΏjکADB E)S-iEՏ( n[n"ȈuBRWoҕ7W[JF  .  #c|'{ZJ)N2RPMui֥PcJ45t{+Zf4R `xqdoYp_9-԰ɟWſJ2%/ 9={uy_~\9Iϼ.Õ)@&"Z0\?~[WQaiy=ڇwuڷZ^&raHɄfw)s^=l2"dEd.v,|_5w)O1>J!o}Ԫ"D?o.GX318OCG/&PfޠS˝ 20)AT$G~3w<8Q ][K@d4(ƾa깧50AŹX-x|#aϴjb~Q[-]zAҌ8Y65kghAa}ؘ* ,Al_GQ_%sZ" ߻>ٺ&iūg~?X^s2{8 n5ji+` ĤA $҇c[4f1iϛ'RnDMcƏ^P A"!!+D_0{D'{L20 E SARH"D0dt7 ȀQQr (~{zclvsy߽ͨF )HA-C4րq _%= 4AO`Yg{u0R@ kJnWaD@խjU.?nVY#ʕF,[ӣ_o! r|¾B<9-:Fn\EFsH89CpsJ[ȉR<` utu?sohAİMIC@"Ji`uP'@w7g3}@b