summaryrefslogtreecommitdiff
path: root/drivers/clk/clk-renesas-pcie.c
diff options
context:
space:
mode:
authorMarek Vasut <marex@denx.de>2022-02-26 05:07:23 +0100
committerStephen Boyd <sboyd@kernel.org>2022-03-18 14:09:27 -0700
commit892e0ddea1aa6f70b68cb2dd8e16bf271e20e72f (patch)
tree110c623822f6f4980d4086fc955118bebd4284be /drivers/clk/clk-renesas-pcie.c
parent0c125f87a84097c182c481be7497af9f816e5db5 (diff)
downloadlinux-892e0ddea1aa6f70b68cb2dd8e16bf271e20e72f.tar.gz
linux-892e0ddea1aa6f70b68cb2dd8e16bf271e20e72f.tar.bz2
linux-892e0ddea1aa6f70b68cb2dd8e16bf271e20e72f.zip
clk: rs9: Add Renesas 9-series PCIe clock generator driver
Add driver for Renesas 9-series PCIe clock generators. This driver is designed to support 9FGV/9DBV/9DMV/9FGL/9DML/9QXL/9SQ series I2C PCIe clock generators, currently the only tested and supported chip is 9FGV0241. The driver is capable of configuring per-chip spread spectrum mode and output amplitude, as well as per-output slew rate. Signed-off-by: Marek Vasut <marex@denx.de> Cc: Michael Turquette <mturquette@baylibre.com> Cc: Rob Herring <robh+dt@kernel.org> Cc: Stephen Boyd <sboyd@kernel.org> Cc: devicetree@vger.kernel.org Link: https://lore.kernel.org/r/20220226040723.143705-3-marex@denx.de [sboyd@kernel.org: Use non-underscore API for fixed factor] Signed-off-by: Stephen Boyd <sboyd@kernel.org>
Diffstat (limited to 'drivers/clk/clk-renesas-pcie.c')
-rw-r--r--drivers/clk/clk-renesas-pcie.c322
1 files changed, 322 insertions, 0 deletions
diff --git a/drivers/clk/clk-renesas-pcie.c b/drivers/clk/clk-renesas-pcie.c
new file mode 100644
index 000000000000..59d9cf0053eb
--- /dev/null
+++ b/drivers/clk/clk-renesas-pcie.c
@@ -0,0 +1,322 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Driver for Renesas 9-series PCIe clock generator driver
+ *
+ * The following series can be supported:
+ * - 9FGV/9DBV/9DMV/9FGL/9DML/9QXL/9SQ
+ * Currently supported:
+ * - 9FGV0241
+ *
+ * Copyright (C) 2022 Marek Vasut <marex@denx.de>
+ */
+
+#include <linux/clk-provider.h>
+#include <linux/i2c.h>
+#include <linux/mod_devicetable.h>
+#include <linux/module.h>
+#include <linux/of.h>
+#include <linux/regmap.h>
+
+#define RS9_REG_OE 0x0
+#define RS9_REG_OE_DIF_OE(n) BIT((n) + 1)
+#define RS9_REG_SS 0x1
+#define RS9_REG_SS_AMP_0V6 0x0
+#define RS9_REG_SS_AMP_0V7 0x1
+#define RS9_REG_SS_AMP_0V8 0x2
+#define RS9_REG_SS_AMP_0V9 0x3
+#define RS9_REG_SS_AMP_MASK 0x3
+#define RS9_REG_SS_SSC_100 0
+#define RS9_REG_SS_SSC_M025 (1 << 3)
+#define RS9_REG_SS_SSC_M050 (3 << 3)
+#define RS9_REG_SS_SSC_MASK (3 << 3)
+#define RS9_REG_SS_SSC_LOCK BIT(5)
+#define RS9_REG_SR 0x2
+#define RS9_REG_SR_2V0_DIF(n) 0
+#define RS9_REG_SR_3V0_DIF(n) BIT((n) + 1)
+#define RS9_REG_SR_DIF_MASK(n) BIT((n) + 1)
+#define RS9_REG_REF 0x3
+#define RS9_REG_REF_OE BIT(4)
+#define RS9_REG_REF_OD BIT(5)
+#define RS9_REG_REF_SR_SLOWEST 0
+#define RS9_REG_REF_SR_SLOW (1 << 6)
+#define RS9_REG_REF_SR_FAST (2 << 6)
+#define RS9_REG_REF_SR_FASTER (3 << 6)
+#define RS9_REG_VID 0x5
+#define RS9_REG_DID 0x6
+#define RS9_REG_BCP 0x7
+
+/* Supported Renesas 9-series models. */
+enum rs9_model {
+ RENESAS_9FGV0241,
+};
+
+/* Structure to describe features of a particular 9-series model */
+struct rs9_chip_info {
+ const enum rs9_model model;
+ unsigned int num_clks;
+};
+
+struct rs9_driver_data {
+ struct i2c_client *client;
+ struct regmap *regmap;
+ const struct rs9_chip_info *chip_info;
+ struct clk *pin_xin;
+ struct clk_hw *clk_dif[2];
+ u8 pll_amplitude;
+ u8 pll_ssc;
+ u8 clk_dif_sr;
+};
+
+/*
+ * Renesas 9-series i2c regmap
+ */
+static const struct regmap_range rs9_readable_ranges[] = {
+ regmap_reg_range(RS9_REG_OE, RS9_REG_REF),
+ regmap_reg_range(RS9_REG_VID, RS9_REG_BCP),
+};
+
+static const struct regmap_access_table rs9_readable_table = {
+ .yes_ranges = rs9_readable_ranges,
+ .n_yes_ranges = ARRAY_SIZE(rs9_readable_ranges),
+};
+
+static const struct regmap_range rs9_writeable_ranges[] = {
+ regmap_reg_range(RS9_REG_OE, RS9_REG_REF),
+ regmap_reg_range(RS9_REG_BCP, RS9_REG_BCP),
+};
+
+static const struct regmap_access_table rs9_writeable_table = {
+ .yes_ranges = rs9_writeable_ranges,
+ .n_yes_ranges = ARRAY_SIZE(rs9_writeable_ranges),
+};
+
+static const struct regmap_config rs9_regmap_config = {
+ .reg_bits = 8,
+ .val_bits = 8,
+ .cache_type = REGCACHE_FLAT,
+ .max_register = 0x8,
+ .rd_table = &rs9_readable_table,
+ .wr_table = &rs9_writeable_table,
+};
+
+static int rs9_get_output_config(struct rs9_driver_data *rs9, int idx)
+{
+ struct i2c_client *client = rs9->client;
+ unsigned char name[5] = "DIF0";
+ struct device_node *np;
+ int ret;
+ u32 sr;
+
+ /* Set defaults */
+ rs9->clk_dif_sr &= ~RS9_REG_SR_DIF_MASK(idx);
+ rs9->clk_dif_sr |= RS9_REG_SR_3V0_DIF(idx);
+
+ snprintf(name, 5, "DIF%d", idx);
+ np = of_get_child_by_name(client->dev.of_node, name);
+ if (!np)
+ return 0;
+
+ /* Output clock slew rate */
+ ret = of_property_read_u32(np, "renesas,slew-rate", &sr);
+ of_node_put(np);
+ if (!ret) {
+ if (sr == 2000000) { /* 2V/ns */
+ rs9->clk_dif_sr &= ~RS9_REG_SR_DIF_MASK(idx);
+ rs9->clk_dif_sr |= RS9_REG_SR_2V0_DIF(idx);
+ } else if (sr == 3000000) { /* 3V/ns (default) */
+ rs9->clk_dif_sr &= ~RS9_REG_SR_DIF_MASK(idx);
+ rs9->clk_dif_sr |= RS9_REG_SR_3V0_DIF(idx);
+ } else
+ ret = dev_err_probe(&client->dev, -EINVAL,
+ "Invalid renesas,slew-rate value\n");
+ }
+
+ return ret;
+}
+
+static int rs9_get_common_config(struct rs9_driver_data *rs9)
+{
+ struct i2c_client *client = rs9->client;
+ struct device_node *np = client->dev.of_node;
+ unsigned int amp, ssc;
+ int ret;
+
+ /* Set defaults */
+ rs9->pll_amplitude = RS9_REG_SS_AMP_0V7;
+ rs9->pll_ssc = RS9_REG_SS_SSC_100;
+
+ /* Output clock amplitude */
+ ret = of_property_read_u32(np, "renesas,out-amplitude-microvolt",
+ &amp);
+ if (!ret) {
+ if (amp == 600000) /* 0.6V */
+ rs9->pll_amplitude = RS9_REG_SS_AMP_0V6;
+ else if (amp == 700000) /* 0.7V (default) */
+ rs9->pll_amplitude = RS9_REG_SS_AMP_0V7;
+ else if (amp == 800000) /* 0.8V */
+ rs9->pll_amplitude = RS9_REG_SS_AMP_0V8;
+ else if (amp == 900000) /* 0.9V */
+ rs9->pll_amplitude = RS9_REG_SS_AMP_0V9;
+ else
+ return dev_err_probe(&client->dev, -EINVAL,
+ "Invalid renesas,out-amplitude-microvolt value\n");
+ }
+
+ /* Output clock spread spectrum */
+ ret = of_property_read_u32(np, "renesas,out-spread-spectrum", &ssc);
+ if (!ret) {
+ if (ssc == 100000) /* 100% ... no spread (default) */
+ rs9->pll_ssc = RS9_REG_SS_SSC_100;
+ else if (ssc == 99750) /* -0.25% ... down spread */
+ rs9->pll_ssc = RS9_REG_SS_SSC_M025;
+ else if (ssc == 99500) /* -0.50% ... down spread */
+ rs9->pll_ssc = RS9_REG_SS_SSC_M050;
+ else
+ return dev_err_probe(&client->dev, -EINVAL,
+ "Invalid renesas,out-spread-spectrum value\n");
+ }
+
+ return 0;
+}
+
+static void rs9_update_config(struct rs9_driver_data *rs9)
+{
+ int i;
+
+ /* If amplitude is non-default, update it. */
+ if (rs9->pll_amplitude != RS9_REG_SS_AMP_0V7) {
+ regmap_update_bits(rs9->regmap, RS9_REG_SS, RS9_REG_SS_AMP_MASK,
+ rs9->pll_amplitude);
+ }
+
+ /* If SSC is non-default, update it. */
+ if (rs9->pll_ssc != RS9_REG_SS_SSC_100) {
+ regmap_update_bits(rs9->regmap, RS9_REG_SS, RS9_REG_SS_SSC_MASK,
+ rs9->pll_ssc);
+ }
+
+ for (i = 0; i < rs9->chip_info->num_clks; i++) {
+ if (rs9->clk_dif_sr & RS9_REG_SR_3V0_DIF(i))
+ continue;
+
+ regmap_update_bits(rs9->regmap, RS9_REG_SR, RS9_REG_SR_3V0_DIF(i),
+ rs9->clk_dif_sr & RS9_REG_SR_3V0_DIF(i));
+ }
+}
+
+static struct clk_hw *
+rs9_of_clk_get(struct of_phandle_args *clkspec, void *data)
+{
+ struct rs9_driver_data *rs9 = data;
+ unsigned int idx = clkspec->args[0];
+
+ return rs9->clk_dif[idx];
+}
+
+static int rs9_probe(struct i2c_client *client, const struct i2c_device_id *id)
+{
+ unsigned char name[5] = "DIF0";
+ struct rs9_driver_data *rs9;
+ struct clk_hw *hw;
+ int i, ret;
+
+ rs9 = devm_kzalloc(&client->dev, sizeof(*rs9), GFP_KERNEL);
+ if (!rs9)
+ return -ENOMEM;
+
+ i2c_set_clientdata(client, rs9);
+ rs9->client = client;
+ rs9->chip_info = device_get_match_data(&client->dev);
+ if (!rs9->chip_info)
+ return -EINVAL;
+
+ /* Fetch common configuration from DT (if specified) */
+ ret = rs9_get_common_config(rs9);
+ if (ret)
+ return ret;
+
+ /* Fetch DIFx output configuration from DT (if specified) */
+ for (i = 0; i < rs9->chip_info->num_clks; i++) {
+ ret = rs9_get_output_config(rs9, i);
+ if (ret)
+ return ret;
+ }
+
+ rs9->regmap = devm_regmap_init_i2c(client, &rs9_regmap_config);
+ if (IS_ERR(rs9->regmap))
+ return dev_err_probe(&client->dev, PTR_ERR(rs9->regmap),
+ "Failed to allocate register map\n");
+
+ /* Register clock */
+ for (i = 0; i < rs9->chip_info->num_clks; i++) {
+ snprintf(name, 5, "DIF%d", i);
+ hw = devm_clk_hw_register_fixed_factor_index(&client->dev, name,
+ 0, 0, 4, 1);
+ if (IS_ERR(hw))
+ return PTR_ERR(hw);
+
+ rs9->clk_dif[i] = hw;
+ }
+
+ ret = devm_of_clk_add_hw_provider(&client->dev, rs9_of_clk_get, rs9);
+ if (!ret)
+ rs9_update_config(rs9);
+
+ return ret;
+}
+
+static int __maybe_unused rs9_suspend(struct device *dev)
+{
+ struct rs9_driver_data *rs9 = dev_get_drvdata(dev);
+
+ regcache_cache_only(rs9->regmap, true);
+ regcache_mark_dirty(rs9->regmap);
+
+ return 0;
+}
+
+static int __maybe_unused rs9_resume(struct device *dev)
+{
+ struct rs9_driver_data *rs9 = dev_get_drvdata(dev);
+ int ret;
+
+ regcache_cache_only(rs9->regmap, false);
+ ret = regcache_sync(rs9->regmap);
+ if (ret)
+ dev_err(dev, "Failed to restore register map: %d\n", ret);
+ return ret;
+}
+
+static const struct rs9_chip_info renesas_9fgv0241_info = {
+ .model = RENESAS_9FGV0241,
+ .num_clks = 2,
+};
+
+static const struct i2c_device_id rs9_id[] = {
+ { "9fgv0241", .driver_data = RENESAS_9FGV0241 },
+ { }
+};
+MODULE_DEVICE_TABLE(i2c, rs9_id);
+
+static const struct of_device_id clk_rs9_of_match[] = {
+ { .compatible = "renesas,9fgv0241", .data = &renesas_9fgv0241_info },
+ { }
+};
+MODULE_DEVICE_TABLE(of, clk_rs9_of_match);
+
+static SIMPLE_DEV_PM_OPS(rs9_pm_ops, rs9_suspend, rs9_resume);
+
+static struct i2c_driver rs9_driver = {
+ .driver = {
+ .name = "clk-renesas-pcie-9series",
+ .pm = &rs9_pm_ops,
+ .of_match_table = clk_rs9_of_match,
+ },
+ .probe = rs9_probe,
+ .id_table = rs9_id,
+};
+module_i2c_driver(rs9_driver);
+
+MODULE_AUTHOR("Marek Vasut <marex@denx.de>");
+MODULE_DESCRIPTION("Renesas 9-series PCIe clock generator driver");
+MODULE_LICENSE("GPL");
tʄe9˯ù0/"L{V ]+n 3Qm߶vc5Tr'5 ~k"JSD12ƋF'R'7k`mߦ c=xY P(6/&WfIaLԒLD(|g;'SMyYk͌ppW+63vqAΉG㤐8 _i='2Ҕ'9‘C^a{}ib[AW=A\ERUyS`},eSE@CO !ûj@xL+sK.:q"㴁o?y "yR"e=%R@Hrw6- U2^ja \%qs췾"b~mJ>Rbe%(!:"0MxGf`MJV&!WԳd~\,PS a"$} ΃ˇ.a+/an%q *xqKEƌVDpOgVVXYkPSaa.:pαZDH1}u%¿1OgG'ja+zze }ceYW] UՃ[Nێ,-Anߋլ.Z@pfG =!f̧g]7T`/e鿃=0!ÎՖr͛y!@E7E/8g)1?(fߝ(H󑎹C󖏈 f߾O'˅ VGvo*tfTmǥw6 t_g>P?xK6 Û޽4˗{:JNE 63&|D_ŀT\ \z@icm#jaVG-k1WGSx>]l@7?; 80e_'/: ?g2Ć;Z{:FHSCQ|S :E0i(Xj*SH逼0|¶WI|S79٩E!r78ei=XQl1}pӽm|A;&fNTp$|0sŠwiv T=8!>)'oT6\V^5c*1=qgP&x[ 0 ; 5gi(s^a0`?_fׄZ.<"4CHB! \TOOƯC!'u䤕7 xm_|,KץDª=*'M̒- 0*@I=Da!uα PK:Qoj[nqZONePJ&WL\@R(48@+ӞY;pȾK^nc5x'GFef̗ѓ@~Ry샻:(%כMCz#h>z2&bx2 DHK ـ 9mMHYN6Q/;`GcőPCÝym0 rj-9+!ʄ;B)GUiuv;;fnC~~oY>nEmްFis G"j7qiaZsأi0yUqSD6Ӽ7؅hŹOO|{?ǝQ/gxj)1,'߯w:k0EJ~%bppw ~}wzzj]ξɇ6зVح@zf<- 'wřGj0~SSlqTtK&[Ưp6k.b0I H@dVo.G\Grv˟ufg3| zhwAW̷ޔ渟@/"Y*1g$1q2KNW}^'3&6ne>s/3\_L`/:joQި2 Ͱc6{ZH/QO s_D}p?].Rd.jaGD!ل BV\j2J>v+ +}1" XiDV wUz~6/>m%si9#A>.[WӋÒ`zՕ"(Bd?ba5; XehTϟTs\4p~,0&K9y=v~y|ӗ9DZl%^SQsK+geob\㩎rkkUY?}zduH~wnM:;n%}A&|pїNU¼#G^]; zr!b1g9ed"ޡa1f]dm :Zxu@z"2 tӗU蝶j^=\!f_f˱UUGфgt:u7R73շ hD"W ;.] W-:;IP,%̄fļkHFDHID&_Hns›>xX =} cQӋM*wWmZY<y|pgxNhOq+k5NgU'6z@XPbkB1Tnʪ- &Qu@=9M@] ΏM8a]x4G&{_|vu.d\2Ǩ 7dTEӂ<D<{23'~ky·j#P# cٰ"b|a!f+=uHM(@@xlҟ0:$#݆F6OvE]c\@uSNS 2PAp2+ErDPB-Z,u_> ^8K5͜eDiXUinpV HwWkR&E]{4Grag&7ks֋Ns^7e`D,=J1CUs:!rI5S>=gEn1Q.%, X#myMe ts11(RiSNjdAwc}sG*8HfU+]lʛj)2PY?.TML9eڨw;H|ϵ!:9~ÉxwO`t Q!H|z.4nd*={&Ēw^])uHb嫯Ǎl,B~*X LRﰢ{DGf@J1od_e]0ݯ~ ttl֢O㽷f?rw0o동6]ɅmqSmS0CUv`1- M#ޣ} wN^#ോ#Z[@FϾSwtL*4t`K;qK7J0f=LCW`` b Km% ì6&n SGa9bI2Z _}Ns@XOI"+?厵MZr Tpf"Sk,%F/9; 9+צůNŔrDZ!D%s[Z̷/  ^W`r ٽm3^#ؼN}sDw,~F[T_3t+Q?(CI}qOK^"bЀyku(<O"ekЈDAUV$oeW@Tz=)^@ BG/90@Ah$s̿oMIskŪ/(+r Y>@otȀB-a,w*~WP^THUdzty5Jc @ ~=fCg@6b\.gS mGwxkwƞͮ$Wj #3OtFt@p%eg½[TIʚNz9?>)ǫfR~%3@aiKD3E+}`MsyD)*πUбa1ksU~D<gV +QFϬmAZׅD'wu/Fѵh oQM7RbGBnPqG2EA)}zH!bpwٿfӚ6q`@gƟa=r% `aV|<#gs ;5%" ~kfN* 0$ 8$|,k\KJ?߫'MV@>spE\e7]i?9yoe7t]ݏ?:ۃ\0PǦ˧ErҐpko/G]{D()/-DkÚٻ^3 <ͼ‡YBØaM;eMxtf; j&Zcd:\{I7:o?d`]߉wǷ&N9Ie^)w>7[%XQOk6IQYHXaK ?G8QҊ AV=~.ַs sKh ^FJ7mWY6ʧі~>35~dAHU|0h,W΁9Vpue);YQ#Rm."7oI5!2MeyKS3 ;^&@@ڂkݓo{#k9pJ`;JRN\ 2UT!{|Z.t2G+A'U$^-a':2Xz,e]^?t$"S:CȢW;r+􃡎6ej3!Kuz~6"EbGK[C&Ӟ)&`gX=]k6k˙aW G|d&d|hY >: s-B*"^kٮ/> w9b407,(LspřCH|P_rW&9sd_fg<嫻N]/e^,0*G4#7:*u.07|׆MZX u7m|*_XQpD82dF5TOhX||5c&a ~>~Dw:l$>/b{Ru,ۗQh'BhG\2S֪&l>c[)Lod6\B 9t]6JpY9BBsh&^Jx&5c+Lл--ܙMbQ:"D)* R 3>|LOU(G'I's8+9*ypSzpV E P]:џD[բR3׾4=bXuzY2A/h#O|VmhCz Axxl^dE) Sͥf,q1EZd#ߌkȹ8"\j=)GPtz}H ,׼\0=Ӌuju%^\W@a _|GO/xLK\槕|~u5Q3&~}{`A|H#>wvԊ*v@0.`#A~^'`@OX=5WLAʠs42 sj{|dfmT -!ٜ^qnn#$W5TLj39Jn=.'#m|̉5EAx.0?*RuOS̔VbH8W.~Vg~ja!:mpQz1O~ G:AIDxL,P۬eV}acMn{.uf<̙lzh}`1M'LGB_Q1 '4 f0 //ow+`"ׇ) r()r {wgZVTO鞕u{'/m7®xBLl楽Qb/io|ayњ6 .w()V% 7xĻ(0>x\@~_l39T< TGĈc}FfICsm9_R./&Ȏd\E4DFxuPx>oӗtLRj\Hg@qǶ|Q^(Rs%a4Co*.-u; \Bm)ں|ɫϺ udeXL+^!r8'mP̧ P|dm'csc&Noǵ2i]!nI 3nr3e /r#ŒHu }͒.YTzXr+]WA0@Hc_'uϧ;>Y߸J9ܦC!\InGH6P{?~x'WlTòMB=WS:EtobRp$lZr뱍 ~>6\':{d7P {J q;c>^j6PsdL6leDT~2x"n#K-/?;hS6WHMxFhyԐ;o$lJBYm㇙P:#IOt?x =КIRb(K(6Ug8N>B0"/tHA!{$ Xj>h吲(9.gZsERsyFޯ  >d_:7< ykK^t=V;zÌ[,t{?jZ4jp+@MKF:^>5vzbL% $NBtcJ/".Ok8-$#._%h,F3^3?8F1z;,Lzv[QJ %]prFAb>隣aQW]}mʳ/FhأE} c>9~x淍,#ql'pPQ6!rbY%khFŠ(å` ͭbi{!;i ݽORdm3=yJu>aFVo$˟(TtHNm`޷OQZp>H:2Mg ZM1\DӐ"nM0Ҹ!>mfcɾxqnqkJZ4]O>Rlᓲ ^B=ʏԯPȗGlv^1\{" z o[;EPG];d9c#{4,!}MqP}<2;癔ݐB&݃< 9a헤TO?!),lIN+a!'$+}4Ԙ1ac8n۷5]w蟟0gζPF@1ֽ9ՇkPfHfAВ<}.i2Ær]4m&+\0">B 3`1^鉶ķr[CLb0|[0SuSWjv ɫa6jLMCTEj L;)5y- )݄6q "z'Isu&ActCOzf8{`>bh̹LkĘjExNUoUW$DC"$`vDO]<٧}\"`3>k" o-&J<92ȍ| ͭvHsQn2q=нFQUӸ,:u,AJ&,zH{F\ҨF=\\ izqudu1o15G8~Y1F~GeU#+mUG퉟x=: $C}Y/1cxQzo8@&):O p|0z3 %Q1b1Xs1.>OFglCJX6%$!in Nıƹ:X?(N˂]nJ}*Ѐ+0c``s:I16*53<E9؁ұeD,IHFn4Yxsf53gND̓jtnF}?@Ijڝ}J .cHMr0s"ȱE!5_7ղ"c3f.!R59`~L[nQICo>Y,3Fakh)H7a!<nJnkr>y#J_q< sf;?wR"BdxWJ\< zWcA0|sInkܽCejkBޕ<ˆo#Z _Mc/ v:f⟑1ێ;[|msЋ)׭9a [ׂ>ɻcjI9$F"]9p9h;?U1NsaSEoäp3=Bd tġ>EFZWr#c$P:w-&q%(T2M=wgN{'jY'ڒ8RG 4"{Q$;ܲ&F֘@ս!ĥPL3byމnnOum֜ dmQ 'XRD++ItX!H?44>& nJК,K$d`u˔x:ACg3dP %I^F^<"#Siasx0V9Yx0a|*+>Wa}Z;Żqd)ݭy[Z^c0al#TP_BTUKYnWB+'Z@Sz * Ai{n}+d.ЃqX# [wu !`8'oǻ }(I,cn]!cp*.W;7˭RJ:O\r91]웟KIydx 7ˀvӂUI@5ȽH-Q45:Ld W[|mP(CA6|ufJJVwTwʖ@0cMvL,~jqgCё *LфH+FxnU԰|%57շa3k/$0 F1A0t_D X |;#dcta0 oJ#ܘu`/Ab{Fazk@ 5m(1!)'eJܵ0(9@p8 W0}`31Yf*y ^2C7fa0JzyF8uǎ>V˕KK'r.qSu k=?m<kUQC(:#Sk3ys@q _=lg sQ^40 Sq~ bPwQCpq;R4`_mqƚ ߪmq R4;$’|%h>鼣޶t2eFǵ@(U1 _qPD:{qvϿ (Ҿ6Sט=]䭎9 pP $;T}䶺|-h9I]=\JN$7lj&}ij̲Ȑ>ᇷI}G$Q[ti(L:|Expaئ2H%ޕ{d:Ak?=Mf׏꿫wbivirFv4W'>$>Sh>OW4+ ^X2&!zT}-z9^UG6gf(hɚ(-82m#3(p=!Y/!7mRkv 8=槿ݫZ1dl8 Vp Wڣmxq {z_2,II@5]pi=ΗBBOR;AF&tLMtg8IIpjE/k1ex:*:F!0hWĮ/\_xeAÙb\wQ}-FxgtDƭYD,"X !M,8D9 ;y;}׎–= N,kr6Z9A8@{F ϣTX:ZVl5Oܨ;>%=%n m( A=Nso/Δ̀^B)PZŌ{*'a}-ޖ<Ў`OEkx2VܪU#+d81,#u{B¤na4Kj_ٖ=?<2MEw1~nU}u!߬^"#kQb9^ޮ6d+Us8fwI:{0Rć#E$ WmڀU&{q2 !C~yHFNGfpM"QEæWf$Xb h'^BMYi([X0%k/z|D`h\UN1:9 (x,v Q.|\ut>;lyB8:]myS bGaD~Tq o?%t=w 1u.,,^wj˂8[j`F` o5oEkxK!}5g S5,9%dL91}ԵИ)>}Xn]H8ٷ! -z0Tt/]dGA3.d5LE$( fq` (>;I,w@V `U/?:ENt3 c΍{@ 3־ X<T Wg~5^=]WL0MIOE=y_ɿaMEw洇t p[ 9j@xopg.bD pPK42Ԕnx \ xٶvF@\\UAJ T Vzg$f%"|otNT9Ih·fb>jF`i̍*bBvIb zUU|W| É]/D"D|Q3nm/,7UClwm`uɰG@Bd!//Gg#Q/1]H~qRڥ@iךW'"',Wʅ2=pG7FƛX9x0F[B\(uS *M^_[7ޞRzkQf(dMɍc[0qbΕG,Z +By5..¾fD#nm =§vIetڔɓolW[n91퇕\A-|i'WN\ 67sJ jk29NuVBY8L|PТnQ 'N!8"4i_e]”6_Ujkh~R<)3F#t8oS_AS4_kJAR'״u,ޒ;R|3ygT)[]ngxk:-(5[3WA񹜼GyYFwkX#NevzC yM7bibSJo^wX\%6N=\xRofj.E@7ag`ۇSXO$TѹXkPxLVᦀn\**sL69gx ydcxAsM{㞞aeiNuic\ȝ2DlcWJGtJcpFk¼ #dВ;.1޵&\,CD2"W"g27Obz0ݗQ5DžϬܳ.JJpx秞ƍyRv :GԼkMu*G [(Jp!XK++H4([Nq۽hn)¦XmT;½%pyh%c>: 3gɮזɚQV$,̾q)]F}-]ܟ-qZ1ݯ ,4C>=wN,%.,H )"M1nQ8mcL4v'rg Hͤ(TFq0fDn ALl',Q4BMUwC'nemAG>Եɣ:td)TY lĸ]4bS_[2fMwR\fu NN8s6=Ƥгyx,C2kApT'Jvۻamuh p*]`K-E-[j3Wl4⣳2^3UO;P=^ vh8_ =eꣾxHɒ2 vAez]_hjH9{,c'_7YmsA9uLܭVMPN1zeZ{ô%[dI`Xz& 7+oG8pt;0w31vJ&SR|>G~_>yNj3nqi@Ѱ7zP[1ٻFgCpɤw>ۼCЭ$}8z1 fiE4^{I1}pwdi1*@[>lЀQp௕̨ptw ]<6B3ZRC.1r0]ʯ4h_gpP]E9Gd! k__ղq)u (mm.\Yc)TQﯲKUYFCG18D0$gm$,ZkϜ?$ jչؗYޓY>aL-+Vk,zUvWT-σShP8#~K&tCd;kpy~|y!o?1Ój~ݦrȦ? O7fEX2ɗ>g&noOE,lǽ{#W^C9 B+7.`#կ9,] L86J]mZ=Sprg`l.Xm:bf5)(Jk\qb߾#M gqȁcB_?t&a1(Pi&;nug;}Q_]p37{ -zND@<wI o CqDG3l["kopWYˆBdS/.4~pO&jG?a+pե{IOx\>뒺ɥjCYZԡVsJg &Z?Q-Ո ̧@](&V~gA65cGK@ДmC Oe@~ij7Գ ;id 8FH:(`JT9W˱،2PמU[lJF!5s'Q^~0f!Fx3!1$J\@a}!(#N$s1K0\Gn]ك9,y%+OMl" 6kĻuoQu-0 ,"Ùu'r+ )1Y me_llD6ϛF=qZSmpvYh7dG lP8KdT 0boAFZA@{:na6ސphS?1";aLrSv|FQ0cC(t{5yIa]E? ί!(џ2^_-A]gK8.V;&ЉQiRnXOƊAkωVS^޺1<ꘜ_?[Tk FEF⶯W~7(C ~L S F]c5˝6Dv(a>|U{ym+hjxUh/bnebˆԊP"yUDԑo`Wa0IѪ^m{zv~MIEt6{DZ,"00u|§YD)[>uѪn;2M:TJj,W) C+jBRXyp}08h{wŽ#KXG jc1_)s:Y͟64YVvJ0.Z 3rˢ$.hh6w-t @Cdez~qeQj)PyMGSE"mc+S)}^w訸t,}›Zyn&~}kX{}Qf!C惃E6}1qYoB H]Hx)*'s;Tz}%\>z?ն'P}ryuŔϥ GohnL.lre·Y+-"^IpI&]tR{#G F,ڰK~D=ʢyoeXo~ Q8n`wT6FC{(ŤKM1zֲ2nk&nda+NNLc@ 69rEq}GxzBB@`./#ϷrpvXp3QUmKt" ,aI|t[ $~'$I' $?*|\f?P!Ľ9 VJ (]cD@R/ h)br$ ; 4~Az?M5U! > p) UJ|?.tƟ|H?Q@oэho(L2l:~컞 {&WXGC_"TUUoo|~_./.ped}brr筂e@Eex;Q'ɝ=( ))@>8 "VMµHo]Uh_ϖG}cgBSy[Xl-r(vl~x/Rdxw3Tg/<ߣos5eyLrU3OO-WURZGv8[ߟ7{\t.\G9m;yJp/8*]@Ona5'AZ?s]GY5! Pq 9g^?O× |+f3Oѷ˫4/F)DH"%W7T?F v翍QY6WtJ'%Sl)BҩQ K4#b~ LO9o 4RP-"@1m̞KL?G_mC1?Þ,np`1S\QpkpT gKzyFp;xw^W1?n_թ|/aX0eJN}Ϯ% >~/[VÉ 3͞_;C=ͧKkG+dn!4Xb٣m0+pθc@* 6"c'GB( )z Q1hbU s(H!_a6j7-@#p-'.꿪Vs0ʟso#h][w]~l-S{{/WYsmCF^BQ/y|2Wx x~ej#GA9/wQɰ~xZ:G~o$qdvv+溃_:gc C]³.<2tVItsg29/#y5]`&Q!00&ٽtb[Ilǔ=ϿӉΥbBaoe:_WN}}O)߻f^pV^Ù|_W-醙|pfI:^ =8 t,5Iw"B (mߞDN D`ݬMur'":{cyG$*)~r)!_LJ ؖMFw&nV?~L&{Y:L-qESX\lDwmMB~{~~oC ԡEQш/bͭpTkOtonm ;]y#9:afC5fIVr?,|CrVX: Uu~,2d8YIZʚ !_%G#^ j՘O18G}GyG|Okf̀tttOJ C\&1!D$c0x q gr,w9KCēZFhZr~{WnGzJn?_M ^'ު̻w{c/mIǝprp-P} zHu̺8(Ƞ/}{{|'O>=\rp7? p/n6ǎ _eRES˷|E|>3/tw]Y&6O|E~m*#KOtj^ÞqnwEgyhn)Ĝ s 5thx@_5Pv[[BG[GhQSNjⲽA^CX̫֠Vd>UbN)KT}Ӈ?(?;z![K.Fl3 `UbLJ?/;V51P|%ܴqKϿRMvG?s[Y~8r;ssQī_Y[״SU;zR,W%6F4L{k1-llk!QMD-,l?6\-/5q @~bgF/=i Ҭ_ m~RHSj\B 4A| uDZ׬_iW.u%ka\ϳ,)[aȌ֘^՜XI)tpeQ.Bb!s#brּ~q^':YD%Nd<ߝXy+ Aϻ1_7e3/o g0b>IΔ*R9Ѽe`kL^}HjՊC$Gs LmxǛ]9FP}OHޜr+ң_' D sYW/X8s7dCd3yD?FGtv/'䓔98~]1$D 7Ti>DD~LE7\\5;롁hu@Ԓm9Un~381~u}<;;4/`Uf N[,("Vj z]aL{fſOK>.d#fo~n;w_qz@MZW_7-q W_}8`?Wz80 WH?Dpw@+A $ fD@=` )X"(M#*虅w8 A}hgE>["\dgE0Y0I&mG"K/ %,֔P#wN[HB-ӜmDAk0wע4VM['c_Y`][O1@8c~RS:ٱډe݇p'N5wos 1^3CY&IfNmgٟ:ɈMn[W~l͉p+D>moix4=7/P]!xp7/\9pW'@(X 6FB"N#oƛc¯hrqC+@xr+lݩ ^I}_+׾+9I`e"{AuUä٩biBVk;bO 6O;{HiԷqV-ٵ}gA"8љ̶ȪB(t2|._sT u5` W0.G Zc^@wa *=ogla%,bV@swog+'S #͔ ӕxL퇡"'c ؤ=).@ç:ja¨I\<0*.0-~Ps!PUHU f :mƄ 7/s3'R7f)k Ōv)m~ުV氢rާM>p& =zI WC`^{.t, t[rŹj>Η?HN $$7💢ON#RRyW?4%ox/ttar!'\Vz(ʠ_L~TkYc"G2TsmscMZvl =8RT#=JXޭ3PI/.sԀQ'(U]{+l ҊL37[srĈ(цځ"i[#uAP4TG]G)J=QLVtHIM9|ދWUk=8eL3未(ũ]zlK][; B[B8AUTE:eΙ}bşt$pq7 +f`- Q"b(5D)PtUh=& 7ܸU2& >h;@=}OM?9Cg:1)`2<5 u V|e|rwaw8cGI[B83<:6" m~a瓲W[mⵚH3êWZ >71Q>ը+~pQ"fO-~nyr9_x^UCņX᫼#!xP_ G.tlgbUsVxO DPq׳/8Ofz47C+; 5hae9v -ry.\s4{8 _а7$&$N0{58ȒQ >{U W}w9mU)"ejr;#DccwgI֖WOO}5&x|~ϋ(Crz"6@,Ă0 HY?|+ zyD',M@!Lvo#pDa|Oi46х }&] O?N8__׃C>Qx={<=(< ׇxGQ/4v_AI:4Mس~5(y>S̹^rX<9`ArE\i9T2W)ww! ގ 7QJ5Z{dHj9m4Fn6 B%Eu-0~oLnlx !+ Ao|?%IuWe$9B/;,^)ۙj.΢]e`rX|IchidrNzojn_ߋJ*Wf .@Rd6Sm\nBϬ躆޵%)25v?RЦ.uMct*ӔYdgdfjvF;r&ˎV[P)mŅ.#~TʮbEfracx_sM ]e-d3acEi! Z9:8^eIHA,ըd sLLsg, 6ÿnV5ک|5wyW9kq=^#`JJyMqcp_2[lLVBK"s G +&ϒƵ]D8Ntll~Cc= A {0)d.lnC4%:뮠iLkuGk:o;zpÍ}^c3PS PDaU1r:*K+*%SPq~'IWG亼 WEٗS[vh/ݑ8EI{Gw04`*hlyB:@dհ"tac26]YY[<[B unWU< =+%+m?\+ rڵ{^'3kL]-$" F3;zˍ Ow<VreC! \`Jf]W&{. J[nVڵ8`@$"BA´QR_Ķ- ~^a *B"'l6- t0kqvVNTce8IЀ7(\sfwDE_]){wK 32C33 $F$"Qi$~s EE?rJQN=;߽)V*Qy@ӕ_bt8MF#|4gXkY˱=hq]l4dA0h>8*`(`n8x*8!t֒@Ns{S>a_{#H It6 : ]|mȖ[xx&#0U16=Ff8|%t/11f$117~PߴFl;hHdeP7ǤncV©@6c-l'T CZC'::o@ }-uy&ǖP!pxNO`bX59f.pK;.9gZ::0`%<^SCpa0@TD" ǴL"* 6]<<^a>0$oP$@!$$>^CB gsb@v:d?n<)'hdg'S 4170$P-rwZCZƊ)E+@j X\OV6P>$5nL[y.M pdD9^**! +iuk4DC$=-+H!d*9P(#EU$cP4!Dd?JB!@(RB t$26XdDJ!MUy"PHb*1 @@ !_ Q#=/@0‚J(}E*ЋxY.TTIx}yC{sI[^![Sڛ cv;iZyѺЩ2cCדՋfO079$0_m}椴XQP&Z  [e/{ta5{r{?_YnpҴs^LW \gcҶnn[vg-~\SB Xgnr/feJʓ|.uJco_).˚4譛/ >uLy6;c;k uOFwpnYv\իǣG7WWOz;}|*(z$T] `Iؿ}\K3~O&59Bzפ7ĒFcc Y{0CG E?mnaiF^@%E&X<钜u'vt{e8AUD_9GdD?/ϷU8?- G4w/y-|d2w ݝSvB2F X/E=@;AV7c ҀEg=.;J?r^j]gѻT=El/Os6U.B\r#ln 7p(_\\1@"yvD0}`כEˮ319$Wsٛs)ks:Cڵ„F;0=taKc𑆔+%m(rW8×䇁n5f{6>0ϮSt雈8خRd&N/bDvEkM`Dy=bQȢQF^ e0k_ 7Y AHQGhb7pUYzQiZ㻺1{ \C`nRXWI{b9`+VL"aHDw_^:W}$eXQ;ڊytS3DSȪ(*J:!$3&_Oh (haaTKQRZ/,,0|vS/>O]>Y8֞I|hwV%(59H9 Jc4 ? JR>k[Ct[)U J).ܹ^ e=X[&{薝ic@U"axr#aŤ͎wqs#?mm".BYf;H Cݔp‹06΄I|"Hc.^>D0y+\@\t[ͭ F4C<?wۅc[~Kt_xLp̤@i@Dõ_V`9S,G%^9eDuiy5^A Ш< OvV?5\Q^EDGW5q[ܢ4 .FQ`RrtBȿ$u*>Q :v3&܃GB"C|""–?eEqx-uZ¹ 2BY!BeNO_廣`k;_`r/ŬUTz\ȇV;QHl!7\'O_w1T[m8징qr d"HS\&$(`WAt ;oq๋+g-HMe cʡR")R)|V)bS!M@jv?|n;Dʉ=\p:0e7}Vq_h_",Mf&xV0>/$p,la,Q ^95',fS}tׁq"wQ G$ʸXMEvdHL?>ۛ&91a6VExzb5l>^u kJj5cF s(5'n̈) ! [vh'U8O_L09BFlaA&,S3kZ[F V~n %a!]%ۿ x$Z`e3ixR1 b&^2*%fU-L,FY|}W?̕^}>Z?oVQ=XYX4]A{SFCL ڃ/۰WG赅(>|(7'EMF`PAnJ&ªvχu85R$$.)@LAH3ĿúgLI*x TuŢoX%:qV%DDB)W7uΟuέI=jN*.ϓo?0O `08|/yD?'$&]W2E^*Zz+7|at .$s;~\eCoFةv^!UIJ:8-d*L'Lư13M9x f)y93&׻Q%od^CZ9 g]tdd7h>!:7<}tr(T Yo7ڣLE~+V:Al]UqfNuR'QR1TL+xy ?}7A;N5lf,ff>}ν bxdo(iÖNa Q@1.eey"FELwcM5xE ?hDz/B`H p_ňER?#xQߝ=`!Ӊ+| >o U i-gr}'^1)rLcha~K/g-S/&br]Tദ"YxCŞ勃3h`y+J"^AMyme]`Ik[~r|֣nG?i绡#b oVCK`FmWY4ݞn `& 67>}о>s‘rY}ZNA*ƗWHֿԹ5y^8᳑A ُiENz/$᫉a$P ( *+A'*)W։p>Ne'+@ *d 9(=ض|꩹$!f+ ,4ի]eNǍ#h{H3uXg;mp;8EfThs^GJfG㚝VH?wv#V5i7-A=|P@3l,$} , :pu(nvmP8+YCw5ç~j.p_1suZ"?biS_3N;#\t?f[L#p}jB0v 2nbfm0DyX ᱡ1KyaSm6Ye%# dV7u7PJh|4w0 qTS׳">p;X~\ϪaA?d/wgKyt5!X3tAT6@la/o良DZc~'pvyq_Rl, u-: gz=`G TXG@;\}İ/ķ/