/* * vt1211.c - driver for the VIA VT1211 Super-I/O chip integrated hardware * monitoring features * Copyright (C) 2006 Juerg Haefliger * * This driver is based on the driver for kernel 2.4 by Mark D. Studebaker * and its port to kernel 2.6 by Lars Ekman. * * 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. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include #include #include #include #include #include #include #include #include #include #include static int uch_config = -1; module_param(uch_config, int, 0); MODULE_PARM_DESC(uch_config, "Initialize the universal channel configuration"); static int int_mode = -1; module_param(int_mode, int, 0); MODULE_PARM_DESC(int_mode, "Force the temperature interrupt mode"); static unsigned short force_id; module_param(force_id, ushort, 0); MODULE_PARM_DESC(force_id, "Override the detected device ID"); static struct platform_device *pdev; #define DRVNAME "vt1211" /* --------------------------------------------------------------------- * Registers * * The sensors are defined as follows. * * Sensor Voltage Mode Temp Mode Notes (from the datasheet) * -------- ------------ --------- -------------------------- * Reading 1 temp1 Intel thermal diode * Reading 3 temp2 Internal thermal diode * UCH1/Reading2 in0 temp3 NTC type thermistor * UCH2 in1 temp4 +2.5V * UCH3 in2 temp5 VccP * UCH4 in3 temp6 +5V * UCH5 in4 temp7 +12V * 3.3V in5 Internal VDD (+3.3V) * * --------------------------------------------------------------------- */ /* Voltages (in) numbered 0-5 (ix) */ #define VT1211_REG_IN(ix) (0x21 + (ix)) #define VT1211_REG_IN_MIN(ix) ((ix) == 0 ? 0x3e : 0x2a + 2 * (ix)) #define VT1211_REG_IN_MAX(ix) ((ix) == 0 ? 0x3d : 0x29 + 2 * (ix)) /* Temperatures (temp) numbered 0-6 (ix) */ static u8 regtemp[] = {0x1f, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25}; static u8 regtempmax[] = {0x39, 0x1d, 0x3d, 0x2b, 0x2d, 0x2f, 0x31}; static u8 regtemphyst[] = {0x3a, 0x1e, 0x3e, 0x2c, 0x2e, 0x30, 0x32}; /* Fans numbered 0-1 (ix) */ #define VT1211_REG_FAN(ix) (0x29 + (ix)) #define VT1211_REG_FAN_MIN(ix) (0x3b + (ix)) #define VT1211_REG_FAN_DIV 0x47 /* PWMs numbered 0-1 (ix) */ /* Auto points numbered 0-3 (ap) */ #define VT1211_REG_PWM(ix) (0x60 + (ix)) #define VT1211_REG_PWM_CLK 0x50 #define VT1211_REG_PWM_CTL 0x51 #define VT1211_REG_PWM_AUTO_TEMP(ap) (0x55 - (ap)) #define VT1211_REG_PWM_AUTO_PWM(ix, ap) (0x58 + 2 * (ix) - (ap)) /* Miscellaneous registers */ #define VT1211_REG_CONFIG 0x40 #define VT1211_REG_ALARM1 0x41 #define VT1211_REG_ALARM2 0x42 #define VT1211_REG_VID 0x45 #define VT1211_REG_UCH_CONFIG 0x4a #define VT1211_REG_TEMP1_CONFIG 0x4b #define VT1211_REG_TEMP2_CONFIG 0x4c /* In, temp & fan alarm bits */ static const u8 bitalarmin[] = {11, 0, 1, 3, 8, 2, 9}; static const u8 bitalarmtemp[] = {4, 15, 11, 0, 1, 3, 8}; static const u8 bitalarmfan[] = {6, 7}; /* --------------------------------------------------------------------- * Data structures and manipulation thereof * --------------------------------------------------------------------- */ struct vt1211_data { unsigned short addr; const char *name; struct device *hwmon_dev; struct mutex update_lock; char valid; /* !=0 if following fields are valid */ unsigned long last_updated; /* In jiffies */ /* Register values */ u8 in[6]; u8 in_max[6]; u8 in_min[6]; u8 temp[7]; u8 temp_max[7]; u8 temp_hyst[7]; u8 fan[2]; u8 fan_min[2]; u8 fan_div[2]; u8 fan_ctl; u8 pwm[2]; u8 pwm_ctl[2]; u8 pwm_clk; u8 pwm_auto_temp[4]; u8 pwm_auto_pwm[2][4]; u8 vid; /* Read once at init time */ u8 vrm; u8 uch_config; /* Read once at init time */ u16 alarms; }; /* ix = [0-5] */ #define ISVOLT(ix, uch_config) ((ix) > 4 ? 1 : \ !(((uch_config) >> ((ix) + 2)) & 1)) /* ix = [0-6] */ #define ISTEMP(ix, uch_config) ((ix) < 2 ? 1 : \ ((uch_config) >> (ix)) & 1) /* in5 (ix = 5) is special. It's the internal 3.3V so it's scaled in the driver according to the VT1211 BIOS porting guide */ #define IN_FROM_REG(ix, reg) ((reg) < 3 ? 0 : (ix) == 5 ? \ (((reg) - 3) * 15882 + 479) / 958 : \ (((reg) - 3) * 10000 + 479) / 958) #define IN_TO_REG(ix, val) (SENSORS_LIMIT((ix) == 5 ? \ ((val) * 958 + 7941) / 15882 + 3 : \ ((val) * 958 + 5000) / 10000 + 3, 0, 255)) /* temp1 (ix = 0) is an intel thermal diode which is scaled in user space. temp2 (ix = 1) is the internal temp diode so it's scaled in the driver according to some measurements that I took on an EPIA M10000. temp3-7 are thermistor based so the driver returns the voltage measured at the pin (range 0V - 2.2V). */ #define TEMP_FROM_REG(ix, reg) ((ix) == 0 ? (reg) * 1000 : \ (ix) == 1 ? (reg) < 51 ? 0 : \ ((reg) - 51) * 1000 : \ ((253 - (reg)) * 2200 + 105) / 210) #define TEMP_TO_REG(ix, val) SENSORS_LIMIT( \ ((ix) == 0 ? ((val) + 500) / 1000 : \ (ix) == 1 ? ((val) + 500) / 1000 + 51 : \ 253 - ((val) * 210 + 1100) / 2200), 0, 255) #define DIV_FROM_REG(reg) (1 << (reg)) #define RPM_FROM_REG(reg, div) (((reg) == 0) || ((reg) == 255) ? 0 : \ 1310720 / (reg) / DIV_FROM_REG(div)) #define RPM_TO_REG(val, div) ((val) == 0 ? 255 : \ SENSORS_LIMIT((1310720 / (val) / \ DIV_FROM_REG(div)), 1, 254)) /* --------------------------------------------------------------------- * Super-I/O constants and functions * --------------------------------------------------------------------- */ /* Configuration index port registers * The vt1211 can live at 2 different addresses so we need to probe both */ #define SIO_REG_CIP1 0x2e #define SIO_REG_CIP2 0x4e /* Configuration registers */ #define SIO_VT1211_LDN 0x07 /* logical device number */ #define SIO_VT1211_DEVID 0x20 /* device ID */ #define SIO_VT1211_DEVREV 0x21 /* device revision */ #define SIO_VT1211_ACTIVE 0x30 /* HW monitor active */ #define SIO_VT1211_BADDR 0x60 /* base I/O address */ #define SIO_VT1211_ID 0x3c /* VT1211 device ID */ /* VT1211 logical device numbers */ #define SIO_VT1211_LDN_HWMON 0x0b /* HW monitor */ static inline void superio_outb(int sio_cip, int reg, int val) { outb(reg, sio_cip); outb(val, sio_cip + 1); } static inline int superio_inb(int sio_cip, int reg) { outb(reg, sio_cip); return inb(sio_cip + 1); } static inline void superio_select(int sio_cip, int ldn) { outb(SIO_VT1211_LDN, sio_cip); outb(ldn, sio_cip + 1); } static inline void superio_enter(int sio_cip) { outb(0x87, sio_cip); outb(0x87, sio_cip); } static inline void superio_exit(int sio_cip) { outb(0xaa, sio_cip); } /* --------------------------------------------------------------------- * Device I/O access * --------------------------------------------------------------------- */ static inline u8 vt1211_read8(struct vt1211_data *data, u8 reg) { return inb(data->addr + reg); } static inline void vt1211_write8(struct vt1211_data *data, u8 reg, u8 val) { outb(val, data->addr + reg); } static struct vt1211_data *vt1211_update_device(struct device *dev) { struct vt1211_data *data = dev_get_drvdata(dev); int ix, val; mutex_lock(&data->update_lock); /* registers cache is refreshed after 1 second */ if (time_after(jiffies, data->last_updated + HZ) || !data->valid) { /* read VID */ data->vid = vt1211_read8(data, VT1211_REG_VID) & 0x1f; /* voltage (in) registers */ for (ix = 0; ix < ARRAY_SIZE(data->in); ix++) { if (ISVOLT(ix, data->uch_config)) { data->in[ix] = vt1211_read8(data, VT1211_REG_IN(ix)); data->in_min[ix] = vt1211_read8(data, VT1211_REG_IN_MIN(ix)); data->in_max[ix] = vt1211_read8(data, VT1211_REG_IN_MAX(ix)); } } /* temp registers */ for (ix = 0; ix < ARRAY_SIZE(data->temp); ix++) { if (ISTEMP(ix, data->uch_config)) { data->temp[ix] = vt1211_read8(data, regtemp[ix]); data->temp_max[ix] = vt1211_read8(data, regtempmax[ix]); data->temp_hyst[ix] = vt1211_read8(data, regtemphyst[ix]); } } /* fan & pwm registers */ for (ix = 0; ix < ARRAY_SIZE(data->fan); ix++) { data->fan[ix] = vt1211_read8(data, VT1211_REG_FAN(ix)); data->fan_min[ix] = vt1211_read8(data, VT1211_REG_FAN_MIN(ix)); data->pwm[ix] = vt1211_read8(data, VT1211_REG_PWM(ix)); } val = vt1211_read8(data, VT1211_REG_FAN_DIV); data->fan_div[0] = (val >> 4) & 3; data->fan_div[1] = (val >> 6) & 3; data->fan_ctl = val & 0xf; val = vt1211_read8(data, VT1211_REG_PWM_CTL); data->pwm_ctl[0] = val & 0xf; data->pwm_ctl[1] = (val >> 4) & 0xf; data->pwm_clk = vt1211_read8(data, VT1211_REG_PWM_CLK); /* pwm & temp auto point registers */ data->pwm_auto_pwm[0][1] = vt1211_read8(data, VT1211_REG_PWM_AUTO_PWM(0, 1)); data->pwm_auto_pwm[0][2] = vt1211_read8(data, VT1211_REG_PWM_AUTO_PWM(0, 2)); data->pwm_auto_pwm[1][1] = vt1211_read8(data, VT1211_REG_PWM_AUTO_PWM(1, 1)); data->pwm_auto_pwm[1][2] = vt1211_read8(data, VT1211_REG_PWM_AUTO_PWM(1, 2)); for (ix = 0; ix < ARRAY_SIZE(data->pwm_auto_temp); ix++) { data->pwm_auto_temp[ix] = vt1211_read8(data, VT1211_REG_PWM_AUTO_TEMP(ix)); } /* alarm registers */ data->alarms = (vt1211_read8(data, VT1211_REG_ALARM2) << 8) | vt1211_read8(data, VT1211_REG_ALARM1); data->last_updated = jiffies; data->valid = 1; } mutex_unlock(&data->update_lock); return data; } /* --------------------------------------------------------------------- * Voltage sysfs interfaces * ix = [0-5] * --------------------------------------------------------------------- */ #define SHOW_IN_INPUT 0 #define SHOW_SET_IN_MIN 1 #define SHOW_SET_IN_MAX 2 #define SHOW_IN_ALARM 3 static ssize_t show_in(struct device *dev, struct device_attribute *attr, char *buf) { struct vt1211_data *data = vt1211_update_device(dev); struct sensor_device_attribute_2 *sensor_attr_2 = to_sensor_dev_attr_2(attr); int ix = sensor_attr_2->index; int fn = sensor_attr_2->nr; int res; switch (fn) { case SHOW_IN_INPUT: res = IN_FROM_REG(ix, data->in[ix]); break; case SHOW_SET_IN_MIN: res = IN_FROM_REG(ix, data->in_min[ix]); break; case SHOW_SET_IN_MAX: res = IN_FROM_REG(ix, data->in_max[ix]); break; case SHOW_IN_ALARM: res = (data->alarms >> bitalarmin[ix]) & 1; break; default: res = 0; dev_dbg(dev, "Unknown attr fetch (%d)\n", fn); } return sprintf(buf, "%d\n", res); } static ssize_t set_in(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct vt1211_data *data = dev_get_drvdata(dev); struct sensor_device_attribute_2 *sensor_attr_2 = to_sensor_dev_attr_2(attr); int ix = sensor_attr_2->index; int fn = sensor_attr_2->nr; long val = simple_strtol(buf, NULL, 10); mutex_lock(&data->update_lock); switch (fn) { case SHOW_SET_IN_MIN: data->in_min[ix] = IN_TO_REG(ix, val); vt1211_write8(data, VT1211_REG_IN_MIN(ix), data->in_min[ix]); break; case SHOW_SET_IN_MAX: data->in_max[ix] = IN_TO_REG(ix, val); vt1211_write8(data, VT1211_REG_IN_MAX(ix), data->in_max[ix]); break; default: dev_dbg(dev, "Unknown attr fetch (%d)\n", fn); } mutex_unlock(&data->update_lock); return count; } /* --------------------------------------------------------------------- * Temperature sysfs interfaces * ix = [0-6] * --------------------------------------------------------------------- */ #define SHOW_TEMP_INPUT 0 #define SHOW_SET_TEMP_MAX 1 #define SHOW_SET_TEMP_MAX_HYST 2 #define SHOW_TEMP_ALARM 3 static ssize_t show_temp(struct device *dev, struct device_attribute *attr, char *buf) { struct vt1211_data *data = vt1211_update_device(dev); struct sensor_device_attribute_2 *sensor_attr_2 = to_sensor_dev_attr_2(attr); int ix = sensor_attr_2->index; int fn = sensor_attr_2->nr; int res; switch (fn) { case SHOW_TEMP_INPUT: res = TEMP_FROM_REG(ix, data->temp[ix]); break; case SHOW_SET_TEMP_MAX: res = TEMP_FROM_REG(ix, data->temp_max[ix]); break; case SHOW_SET_TEMP_MAX_HYST: res = TEMP_FROM_REG(ix, data->temp_hyst[ix]); break; case SHOW_TEMP_ALARM: res = (data->alarms >> bitalarmtemp[ix]) & 1; break; default: res = 0; dev_dbg(dev, "Unknown attr fetch (%d)\n", fn); } return sprintf(buf, "%d\n", res); } static ssize_t set_temp(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct vt1211_data *data = dev_get_drvdata(dev); struct sensor_device_attribute_2 *sensor_attr_2 = to_sensor_dev_attr_2(attr); int ix = sensor_attr_2->index; int fn = sensor_attr_2->nr; long val = simple_strtol(buf, NULL, 10); mutex_lock(&data->update_lock); switch (fn) { case SHOW_SET_TEMP_MAX: data->temp_max[ix] = TEMP_TO_REG(ix, val); vt1211_write8(data, regtempmax[ix], data->temp_max[ix]); break; case SHOW_SET_TEMP_MAX_HYST: data->temp_hyst[ix] = TEMP_TO_REG(ix, val); vt1211_write8(data, regtemphyst[ix], data->temp_hyst[ix]); break; default: dev_dbg(dev, "Unknown attr fetch (%d)\n", fn); } mutex_unlock(&data->update_lock); return count; } /* --------------------------------------------------------------------- * Fan sysfs interfaces * ix = [0-1] * --------------------------------------------------------------------- */ #define SHOW_FAN_INPUT 0 #define SHOW_SET_FAN_MIN 1 #define SHOW_SET_FAN_DIV 2 #define SHOW_FAN_ALARM 3 static ssize_t show_fan(struct device *dev, struct device_attribute *attr, char *buf) { struct vt1211_data *data = vt1211_update_device(dev); struct sensor_device_attribute_2 *sensor_attr_2 = to_sensor_dev_attr_2(attr); int ix = sensor_attr_2->index; int fn = sensor_attr_2->nr; int res; switch (fn) { case SHOW_FAN_INPUT: res = RPM_FROM_REG(data->fan[ix], data->fan_div[ix]); break; case SHOW_SET_FAN_MIN: res = RPM_FROM_REG(data->fan_min[ix], data->fan_div[ix]); break; case SHOW_SET_FAN_DIV: res = DIV_FROM_REG(data->fan_div[ix]); break; case SHOW_FAN_ALARM: res = (data->alarms >> bitalarmfan[ix]) & 1; break; default: res = 0; dev_dbg(dev, "Unknown attr fetch (%d)\n", fn); } return sprintf(buf, "%d\n", res); } static ssize_t set_fan(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct vt1211_data *data = dev_get_drvdata(dev); struct sensor_device_attribute_2 *sensor_attr_2 = to_sensor_dev_attr_2(attr); int ix = sensor_attr_2->index; int fn = sensor_attr_2->nr; long val = simple_strtol(buf, NULL, 10); int reg; mutex_lock(&data->update_lock); /* sync the data cache */ reg = vt1211_read8(data, VT1211_REG_FAN_DIV); data->fan_div[0] = (reg >> 4) & 3; data->fan_div[1] = (reg >> 6) & 3; data->fan_ctl = reg & 0xf; switch (fn) { case SHOW_SET_FAN_MIN: data->fan_min[ix] = RPM_TO_REG(val, data->fan_div[ix]); vt1211_write8(data, VT1211_REG_FAN_MIN(ix), data->fan_min[ix]); break; case SHOW_SET_FAN_DIV: switch (val) { case 1: data->fan_div[ix] = 0; break; case 2: data->fan_div[ix] = 1; break; case 4: data->fan_div[ix] = 2; break; case 8: data->fan_div[ix] = 3; break; default: count = -EINVAL; dev_warn(dev, "fan div value %ld not " "supported. Choose one of 1, 2, " "4, or 8.\n", val); goto EXIT; } vt1211_write8(data, VT1211_REG_FAN_DIV, ((data->fan_div[1] << 6) | (data->fan_div[0] << 4) | data->fan_ctl)); break; default: dev_dbg(dev, "Unknown attr fetch (%d)\n", fn); } EXIT: mutex_unlock(&data->update_lock); return count; } /* --------------------------------------------------------------------- * PWM sysfs interfaces * ix = [0-1] * --------------------------------------------------------------------- */ #define SHOW_PWM 0 #define SHOW_SET_PWM_ENABLE 1 #define SHOW_SET_PWM_FREQ 2 #define SHOW_SET_PWM_AUTO_CHANNELS_TEMP 3 static ssize_t show_pwm(struct device *dev, struct device_attribute *attr, char *buf) { struct vt1211_data *data = vt1211_update_device(dev); struct sensor_device_attribute_2 *sensor_attr_2 = to_sensor_dev_attr_2(attr); int ix = sensor_attr_2->index; int fn = sensor_attr_2->nr; int res; switch (fn) { case SHOW_PWM: res = data->pwm[ix]; break; case SHOW_SET_PWM_ENABLE: res = ((data->pwm_ctl[ix] >> 3) & 1) ? 2 : 0; break; case SHOW_SET_PWM_FREQ: res = 90000 >> (data->pwm_clk & 7); break; case SHOW_SET_PWM_AUTO_CHANNELS_TEMP: res = (data->pwm_ctl[ix] & 7) + 1; break; default: res = 0; dev_dbg(dev, "Unknown attr fetch (%d)\n", fn); } return sprintf(buf, "%d\n", res); } static ssize_t set_pwm(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct vt1211_data *data = dev_get_drvdata(dev); struct sensor_device_attribute_2 *sensor_attr_2 = to_sensor_dev_attr_2(attr); int ix = sensor_attr_2->index; int fn = sensor_attr_2->nr; long val = simple_strtol(buf, NULL, 10); int tmp, reg; mutex_lock(&data->update_lock); switch (fn) { case SHOW_SET_PWM_ENABLE: /* sync the data cache */ reg = vt1211_read8(data, VT1211_REG_FAN_DIV); data->fan_div[0] = (reg >> 4) & 3; data->fan_div[1] = (reg >> 6) & 3; data->fan_ctl = reg & 0xf; reg = vt1211_read8(data, VT1211_REG_PWM_CTL); data->pwm_ctl[0] = reg & 0xf; data->pwm_ctl[1] = (reg >> 4) & 0xf; switch (val) { case 0: data->pwm_ctl[ix] &= 7; /* disable SmartGuardian if both PWM outputs are * disabled */ if ((data->pwm_ctl[ix ^ 1] & 1) == 0) { data->fan_ctl &= 0xe; } break; case 2: data->pwm_ctl[ix] |= 8; data->fan_ctl |= 1; break; default: count = -EINVAL; dev_warn(dev, "pwm mode %ld not supported. " "Choose one of 0 or 2.\n", val); goto EXIT; } vt1211_write8(data, VT1211_REG_PWM_CTL, ((data->pwm_ctl[1] << 4) | data->pwm_ctl[0])); vt1211_write8(data, VT1211_REG_FAN_DIV, ((data->fan_div[1] << 6) | (data->fan_div[0] << 4) | data->fan_ctl)); break; case SHOW_SET_PWM_FREQ: val = 135000 / SENSORS_LIMIT(val, 135000 >> 7, 135000); /* calculate tmp = log2(val) */ tmp = 0; for (val >>= 1; val > 0; val >>= 1) { tmp++; } /* sync the data cache */ reg = vt1211_read8(data, VT1211_REG_PWM_CLK); data->pwm_clk = (reg & 0xf8) | tmp; vt1211_write8(data, VT1211_REG_PWM_CLK, data->pwm_clk); break; case SHOW_SET_PWM_AUTO_CHANNELS_TEMP: if ((val < 1) || (val > 7)) { count = -EINVAL; dev_warn(dev, "temp channel %ld not supported. " "Choose a value between 1 and 7.\n", val); goto EXIT; } if (!ISTEMP(val - 1, data->uch_config)) { count = -EINVAL; dev_warn(dev, "temp channel %ld is not available.\n", val); goto EXIT; } /* sync the data cache */ reg = vt1211_read8(data, VT1211_REG_PWM_CTL); data->pwm_ctl[0] = reg & 0xf; data->pwm_ctl[1] = (reg >> 4) & 0xf; data->pwm_ctl[ix] = (data->pwm_ctl[ix] & 8) | (val - 1); vt1211_write8(data, VT1211_REG_PWM_CTL, ((data->pwm_ctl[1] << 4) | data->pwm_ctl[0])); break; default: dev_dbg(dev, "Unknown attr fetch (%d)\n", fn); } EXIT: mutex_unlock(&data->update_lock); return count; } /* --------------------------------------------------------------------- * PWM auto point definitions * ix = [0-1] * ap = [0-3] * --------------------------------------------------------------------- */ /* * pwm[ix+1]_auto_point[ap+1]_temp mapping table: * Note that there is only a single set of temp auto points that controls both * PWM controllers. We still create 2 sets of sysfs files to make it look * more consistent even though they map to the same registers. * * ix ap : description * ------------------- * 0 0 : pwm1/2 off temperature (pwm_auto_temp[0]) * 0 1 : pwm1/2 low speed temperature (pwm_auto_temp[1]) * 0 2 : pwm1/2 high speed temperature (pwm_auto_temp[2]) * 0 3 : pwm1/2 full speed temperature (pwm_auto_temp[3]) * 1 0 : pwm1/2 off temperature (pwm_auto_temp[0]) * 1 1 : pwm1/2 low speed temperature (pwm_auto_temp[1]) * 1 2 : pwm1/2 high speed temperature (pwm_auto_temp[2]) * 1 3 : pwm1/2 full speed temperature (pwm_auto_temp[3]) */ static ssize_t show_pwm_auto_point_temp(struct device *dev, struct device_attribute *attr, char *buf) { struct vt1211_data *data = vt1211_update_device(dev); struct sensor_device_attribute_2 *sensor_attr_2 = to_sensor_dev_attr_2(attr); int ix = sensor_attr_2->index; int ap = sensor_attr_2->nr; return sprintf(buf, "%d\n", TEMP_FROM_REG(data->pwm_ctl[ix] & 7, data->pwm_auto_temp[ap])); } static ssize_t set_pwm_auto_point_temp(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct vt1211_data *data = dev_get_drvdata(dev); struct sensor_device_attribute_2 *sensor_attr_2 = to_sensor_dev_attr_2(attr); int ix = sensor_attr_2->index; int ap = sensor_attr_2->nr; long val = simple_strtol(buf, NULL, 10); int reg; mutex_lock(&data->update_lock); /* sync the data cache */ reg = vt1211_read8(data, VT1211_REG_PWM_CTL); data->pwm_ctl[0] = reg & 0xf; data->pwm_ctl[1] = (reg >> 4) & 0xf; data->pwm_auto_temp[ap] = TEMP_TO_REG(data->pwm_ctl[ix] & 7, val); vt1211_write8(data, VT1211_REG_PWM_AUTO_TEMP(ap), data->pwm_auto_temp[ap]); mutex_unlock(&data->update_lock); return count; } /* * pwm[ix+1]_auto_point[ap+1]_pwm mapping table: * Note that the PWM auto points 0 & 3 are hard-wired in the VT1211 and can't * be changed. * * ix ap : description * ------------------- * 0 0 : pwm1 off (pwm_auto_pwm[0][0], hard-wired to 0) * 0 1 : pwm1 low speed duty cycle (pwm_auto_pwm[0][1]) * 0 2 : pwm1 high speed duty cycle (pwm_auto_pwm[0][2]) * 0 3 : pwm1 full speed (pwm_auto_pwm[0][3], hard-wired to 255) * 1 0 : pwm2 off (pwm_auto_pwm[1][0], hard-wired to 0) * 1 1 : pwm2 low speed duty cycle (pwm_auto_pwm[1][1]) * 1 2 : pwm2 high speed duty cycle (pwm_auto_pwm[1][2]) * 1 3 : pwm2 full speed (pwm_auto_pwm[1][3], hard-wired to 255) */ static ssize_t show_pwm_auto_point_pwm(struct device *dev, struct device_attribute *attr, char *buf) { struct vt1211_data *data = vt1211_update_device(dev); struct sensor_device_attribute_2 *sensor_attr_2 = to_sensor_dev_attr_2(attr); int ix = sensor_attr_2->index; int ap = sensor_attr_2->nr; return sprintf(buf, "%d\n", data->pwm_auto_pwm[ix][ap]); } static ssize_t set_pwm_auto_point_pwm(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct vt1211_data *data = dev_get_drvdata(dev); struct sensor_device_attribute_2 *sensor_attr_2 = to_sensor_dev_attr_2(attr); int ix = sensor_attr_2->index; int ap = sensor_attr_2->nr; long val = simple_strtol(buf, NULL, 10); if ((val < 0) || (val > 255)) { dev_err(dev, "pwm value %ld is out of range. " "Choose a value between 0 and 255.\n" , val); return -EINVAL; } mutex_lock(&data->update_lock); data->pwm_auto_pwm[ix][ap] = val; vt1211_write8(data, VT1211_REG_PWM_AUTO_PWM(ix, ap), data->pwm_auto_pwm[ix][ap]); mutex_unlock(&data->update_lock); return count; } /* --------------------------------------------------------------------- * Miscellaneous sysfs interfaces (VRM, VID, name, and (legacy) alarms) * --------------------------------------------------------------------- */ static ssize_t show_vrm(struct device *dev, struct device_attribute *attr, char *buf) { struct vt1211_data *data = dev_get_drvdata(dev); return sprintf(buf, "%d\n", data->vrm); } static ssize_t set_vrm(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct vt1211_data *data = dev_get_drvdata(dev); long val = simple_strtol(buf, NULL, 10); data->vrm = val; return count; } static ssize_t show_vid(struct device *dev, struct device_attribute *attr, char *buf) { struct vt1211_data *data = dev_get_drvdata(dev); return sprintf(buf, "%d\n", vid_from_reg(data->vid, data->vrm)); } static ssize_t show_name(struct device *dev, struct device_attribute *attr, char *buf) { struct vt1211_data *data = dev_get_drvdata(dev); return sprintf(buf, "%s\n", data->name); } static ssize_t show_alarms(struct device *dev, struct device_attribute *attr, char *buf) { struct vt1211_data *data = vt1211_update_device(dev); return sprintf(buf, "%d\n", data->alarms); } /* --------------------------------------------------------------------- * Device attribute structs * --------------------------------------------------------------------- */ #define SENSOR_ATTR_IN_INPUT(ix) \ SENSOR_ATTR_2(in##ix##_input, S_IRUGO, \ show_in, NULL, SHOW_IN_INPUT, ix) static struct sensor_device_attribute_2 vt1211_sysfs_in_input[] = { SENSOR_ATTR_IN_INPUT(0), SENSOR_ATTR_IN_INPUT(1), SENSOR_ATTR_IN_INPUT(2), SENSOR_ATTR_IN_INPUT(3), SENSOR_ATTR_IN_INPUT(4), SENSOR_ATTR_IN_INPUT(5), }; #define SENSOR_ATTR_IN_MIN(ix) \ SENSOR_ATTR_2(in##ix##_min, S_IRUGO | S_IWUSR, \ show_in, set_in, SHOW_SET_IN_MIN, ix) static struct sensor_device_attribute_2 vt1211_sysfs_in_min[] = { SENSOR_ATTR_IN_MIN(0), SENSOR_ATTR_IN_MIN(1), SENSOR_ATTR_IN_MIN(2), SENSOR_ATTR_IN_MIN(3), SENSOR_ATTR_IN_MIN(4), SENSOR_ATTR_IN_MIN(5), }; #define SENSOR_ATTR_IN_MAX(ix) \ SENSOR_ATTR_2(in##ix##_max, S_IRUGO | S_IWUSR, \ show_in, set_in, SHOW_SET_IN_MAX, ix) static struct sensor_device_attribute_2 vt1211_sysfs_in_max[] = { SENSOR_ATTR_IN_MAX(0), SENSOR_ATTR_IN_MAX(1), SENSOR_ATTR_IN_MAX(2), SENSOR_ATTR_IN_MAX(3), SENSOR_ATTR_IN_MAX(4), SENSOR_ATTR_IN_MAX(5), }; #define SENSOR_ATTR_IN_ALARM(ix) \ SENSOR_ATTR_2(in##ix##_alarm, S_IRUGO, \ show_in, NULL, SHOW_IN_ALARM, ix) static struct sensor_device_attribute_2 vt1211_sysfs_in_alarm[] = { SENSOR_ATTR_IN_ALARM(0), SENSOR_ATTR_IN_ALARM(1), SENSOR_ATTR_IN_ALARM(2), SENSOR_ATTR_IN_ALARM(3), SENSOR_ATTR_IN_ALARM(4), SENSOR_ATTR_IN_ALARM(5), }; #define SENSOR_ATTR_TEMP_INPUT(ix) \ SENSOR_ATTR_2(temp##ix##_input, S_IRUGO, \ show_temp, NULL, SHOW_TEMP_INPUT, ix-1) static struct sensor_device_attribute_2 vt1211_sysfs_temp_input[] = { SENSOR_ATTR_TEMP_INPUT(1), SENSOR_ATTR_TEMP_INPUT(2), SENSOR_ATTR_TEMP_INPUT(3), SENSOR_ATTR_TEMP_INPUT(4), SENSOR_ATTR_TEMP_INPUT(5), SENSOR_ATTR_TEMP_INPUT(6), SENSOR_ATTR_TEMP_INPUT(7), }; #define SENSOR_ATTR_TEMP_MAX(ix) \ SENSOR_ATTR_2(temp##ix##_max, S_IRUGO | S_IWUSR, \ show_temp, set_temp, SHOW_SET_TEMP_MAX, ix-1) static struct sensor_device_attribute_2 vt1211_sysfs_temp_max[] = { SENSOR_ATTR_TEMP_MAX(1), SENSOR_ATTR_TEMP_MAX(2), SENSOR_ATTR_TEMP_MAX(3), SENSOR_ATTR_TEMP_MAX(4), SENSOR_ATTR_TEMP_MAX(5), SENSOR_ATTR_TEMP_MAX(6), SENSOR_ATTR_TEMP_MAX(7), }; #define SENSOR_ATTR_TEMP_MAX_HYST(ix) \ SENSOR_ATTR_2(temp##ix##_max_hyst, S_IRUGO | S_IWUSR, \ show_temp, set_temp, SHOW_SET_TEMP_MAX_HYST, ix-1) static struct sensor_device_attribute_2 vt1211_sysfs_temp_max_hyst[] = { SENSOR_ATTR_TEMP_MAX_HYST(1), SENSOR_ATTR_TEMP_MAX_HYST(2), SENSOR_ATTR_TEMP_MAX_HYST(3), SENSOR_ATTR_TEMP_MAX_HYST(4), SENSOR_ATTR_TEMP_MAX_HYST(5), SENSOR_ATTR_TEMP_MAX_HYST(6), SENSOR_ATTR_TEMP_MAX_HYST(7), }; #define SENSOR_ATTR_TEMP_ALARM(ix) \ SENSOR_ATTR_2(temp##ix##_alarm, S_IRUGO, \ show_temp, NULL, SHOW_TEMP_ALARM, ix-1) static struct sensor_device_attribute_2 vt1211_sysfs_temp_alarm[] = { SENSOR_ATTR_TEMP_ALARM(1), SENSOR_ATTR_TEMP_ALARM(2), SENSOR_ATTR_TEMP_ALARM(3), SENSOR_ATTR_TEMP_ALARM(4), SENSOR_ATTR_TEMP_ALARM(5), SENSOR_ATTR_TEMP_ALARM(6), SENSOR_ATTR_TEMP_ALARM(7), }; #define SENSOR_ATTR_FAN(ix) \ SENSOR_ATTR_2(fan##ix##_input, S_IRUGO, \ show_fan, NULL, SHOW_FAN_INPUT, ix-1), \ SENSOR_ATTR_2(fan##ix##_min, S_IRUGO | S_IWUSR, \ show_fan, set_fan, SHOW_SET_FAN_MIN, ix-1), \ SENSOR_ATTR_2(fan##ix##_div, S_IRUGO | S_IWUSR, \ show_fan, set_fan, SHOW_SET_FAN_DIV, ix-1), \ SENSOR_ATTR_2(fan##ix##_alarm, S_IRUGO, \ show_fan, NULL, SHOW_FAN_ALARM, ix-1) #define SENSOR_ATTR_PWM(ix) \ SENSOR_ATTR_2(pwm##ix, S_IRUGO, \ show_pwm, NULL, SHOW_PWM, ix-1), \ SENSOR_ATTR_2(pwm##ix##_enable, S_IRUGO | S_IWUSR, \ show_pwm, set_pwm, SHOW_SET_PWM_ENABLE, ix-1), \ SENSOR_ATTR_2(pwm##ix##_auto_channels_temp, S_IRUGO | S_IWUSR, \ show_pwm, set_pwm, SHOW_SET_PWM_AUTO_CHANNELS_TEMP, ix-1) #define SENSOR_ATTR_PWM_FREQ(ix) \ SENSOR_ATTR_2(pwm##ix##_freq, S_IRUGO | S_IWUSR, \ show_pwm, set_pwm, SHOW_SET_PWM_FREQ, ix-1) #define SENSOR_ATTR_PWM_FREQ_RO(ix) \ SENSOR_ATTR_2(pwm##ix##_freq, S_IRUGO, \ show_pwm, NULL, SHOW_SET_PWM_FREQ, ix-1) #define SENSOR_ATTR_PWM_AUTO_POINT_TEMP(ix, ap) \ SENSOR_ATTR_2(pwm##ix##_auto_point##ap##_temp, S_IRUGO | S_IWUSR, \ show_pwm_auto_point_temp, set_pwm_auto_point_temp, \ ap-1, ix-1) #define SENSOR_ATTR_PWM_AUTO_POINT_TEMP_RO(ix, ap) \ SENSOR_ATTR_2(pwm##ix##_auto_point##ap##_temp, S_IRUGO, \ show_pwm_auto_point_temp, NULL, \ ap-1, ix-1) #define SENSOR_ATTR_PWM_AUTO_POINT_PWM(ix, ap) \ SENSOR_ATTR_2(pwm##ix##_auto_point##ap##_pwm, S_IRUGO | S_IWUSR, \ show_pwm_auto_point_pwm, set_pwm_auto_point_pwm, \ ap-1, ix-1) #define SENSOR_ATTR_PWM_AUTO_POINT_PWM_RO(ix, ap) \ SENSOR_ATTR_2(pwm##ix##_auto_point##ap##_pwm, S_IRUGO, \ show_pwm_auto_point_pwm, NULL, \ ap-1, ix-1) static struct sensor_device_attribute_2 vt1211_sysfs_fan_pwm[] = { SENSOR_ATTR_FAN(1), SENSOR_ATTR_FAN(2), SENSOR_ATTR_PWM(1), SENSOR_ATTR_PWM(2), SENSOR_ATTR_PWM_FREQ(1), SENSOR_ATTR_PWM_FREQ_RO(2), SENSOR_ATTR_PWM_AUTO_POINT_TEMP(1, 1), SENSOR_ATTR_PWM_AUTO_POINT_TEMP(1, 2), SENSOR_ATTR_PWM_AUTO_POINT_TEMP(1, 3), SENSOR_ATTR_PWM_AUTO_POINT_TEMP(1, 4), SENSOR_ATTR_PWM_AUTO_POINT_TEMP_RO(2, 1), SENSOR_ATTR_PWM_AUTO_POINT_TEMP_RO(2, 2), SENSOR_ATTR_PWM_AUTO_POINT_TEMP_RO(2, 3), SENSOR_ATTR_PWM_AUTO_POINT_TEMP_RO(2, 4), SENSOR_ATTR_PWM_AUTO_POINT_PWM_RO(1, 1), SENSOR_ATTR_PWM_AUTO_POINT_PWM(1, 2), SENSOR_ATTR_PWM_AUTO_POINT_PWM(1, 3), SENSOR_ATTR_PWM_AUTO_POINT_PWM_RO(1, 4), SENSOR_ATTR_PWM_AUTO_POINT_PWM_RO(2, 1), SENSOR_ATTR_PWM_AUTO_POINT_PWM(2, 2), SENSOR_ATTR_PWM_AUTO_POINT_PWM(2, 3), SENSOR_ATTR_PWM_AUTO_POINT_PWM_RO(2, 4), }; static struct device_attribute vt1211_sysfs_misc[] = { __ATTR(vrm, S_IRUGO | S_IWUSR, show_vrm, set_vrm), __ATTR(cpu0_vid, S_IRUGO, show_vid, NULL), __ATTR(name, S_IRUGO, show_name, NULL), __ATTR(alarms, S_IRUGO, show_alarms, NULL), }; /* --------------------------------------------------------------------- * Device registration and initialization * --------------------------------------------------------------------- */ static void __devinit vt1211_init_device(struct vt1211_data *data) { /* set VRM */ data->vrm = vid_which_vrm(); /* Read (and initialize) UCH config */ data->uch_config = vt1211_read8(data, VT1211_REG_UCH_CONFIG); if (uch_config > -1) { data->uch_config = (data->uch_config & 0x83) | (uch_config << 2); vt1211_write8(data, VT1211_REG_UCH_CONFIG, data->uch_config); } /* Initialize the interrupt mode (if request at module load time). * The VT1211 implements 3 different modes for clearing interrupts: * 0: Clear INT when status register is read. Regenerate INT as long * as temp stays above hysteresis limit. * 1: Clear INT when status register is read. DON'T regenerate INT * until temp falls below hysteresis limit and exceeds hot limit * again. * 2: Clear INT when temp falls below max limit. * * The driver only allows to force mode 0 since that's the only one * that makes sense for 'sensors' */ if (int_mode == 0) { vt1211_write8(data, VT1211_REG_TEMP1_CONFIG, 0); vt1211_write8(data, VT1211_REG_TEMP2_CONFIG, 0); } /* Fill in some hard wired values into our data struct */ data->pwm_auto_pwm[0][3] = 255; data->pwm_auto_pwm[1][3] = 255; } static void vt1211_remove_sysfs(struct platform_device *pdev) { struct device *dev = &pdev->dev; int i; for (i = 0; i < ARRAY_SIZE(vt1211_sysfs_in_input); i++) { device_remove_file(dev, &vt1211_sysfs_in_input[i].dev_attr); device_remove_file(dev, &vt1211_sysfs_in_min[i].dev_attr); device_remove_file(dev, &vt1211_sysfs_in_max[i].dev_attr); device_remove_file(dev, &vt1211_sysfs_in_alarm[i].dev_attr); } for (i = 0; i < ARRAY_SIZE(vt1211_sysfs_temp_input); i++) { device_remove_file(dev, &vt1211_sysfs_temp_input[i].dev_attr); device_remove_file(dev, &vt1211_sysfs_temp_max[i].dev_attr); device_remove_file(dev, &vt1211_sysfs_temp_max_hyst[i].dev_attr); device_remove_file(dev, &vt1211_sysfs_temp_alarm[i].dev_attr); } for (i = 0; i < ARRAY_SIZE(vt1211_sysfs_fan_pwm); i++) { device_remove_file(dev, &vt1211_sysfs_fan_pwm[i].dev_attr); } for (i = 0; i < ARRAY_SIZE(vt1211_sysfs_misc); i++) { device_remove_file(dev, &vt1211_sysfs_misc[i]); } } static int __devinit vt1211_probe(struct platform_device *pdev) { struct device *dev = &pdev->dev; struct vt1211_data *data; struct resource *res; int i, err; if (!(data = kzalloc(sizeof(struct vt1211_data), GFP_KERNEL))) { err = -ENOMEM; dev_err(dev, "Out of memory\n"); goto EXIT; } res = platform_get_resource(pdev, IORESOURCE_IO, 0); if (!request_region(res->start, resource_size(res), DRVNAME)) { err = -EBUSY; dev_err(dev, "Failed to request region 0x%lx-0x%lx\n", (unsigned long)res->start, (unsigned long)res->end); goto EXIT_KFREE; } data->addr = res->start; data->name = DRVNAME; mutex_init(&data->update_lock); platform_set_drvdata(pdev, data); /* Initialize the VT1211 chip */ vt1211_init_device(data); /* Create sysfs interface files */ for (i = 0; i < ARRAY_SIZE(vt1211_sysfs_in_input); i++) { if (ISVOLT(i, data->uch_config)) { if ((err = device_create_file(dev, &vt1211_sysfs_in_input[i].dev_attr)) || (err = device_create_file(dev, &vt1211_sysfs_in_min[i].dev_attr)) || (err = device_create_file(dev, &vt1211_sysfs_in_max[i].dev_attr)) || (err = device_create_file(dev, &vt1211_sysfs_in_alarm[i].dev_attr))) { goto EXIT_DEV_REMOVE; } } } for (i = 0; i < ARRAY_SIZE(vt1211_sysfs_temp_input); i++) { if (ISTEMP(i, data->uch_config)) { if ((err = device_create_file(dev, &vt1211_sysfs_temp_input[i].dev_attr)) || (err = device_create_file(dev, &vt1211_sysfs_temp_max[i].dev_attr)) || (err = device_create_file(dev, &vt1211_sysfs_temp_max_hyst[i].dev_attr)) || (err = device_create_file(dev, &vt1211_sysfs_temp_alarm[i].dev_attr))) { goto EXIT_DEV_REMOVE; } } } for (i = 0; i < ARRAY_SIZE(vt1211_sysfs_fan_pwm); i++) { err = device_create_file(dev, &vt1211_sysfs_fan_pwm[i].dev_attr); if (err) { goto EXIT_DEV_REMOVE; } } for (i = 0; i < ARRAY_SIZE(vt1211_sysfs_misc); i++) { err = device_create_file(dev, &vt1211_sysfs_misc[i]); if (err) { goto EXIT_DEV_REMOVE; } } /* Register device */ data->hwmon_dev = hwmon_device_register(dev); if (IS_ERR(data->hwmon_dev)) { err = PTR_ERR(data->hwmon_dev); dev_err(dev, "Class registration failed (%d)\n", err); goto EXIT_DEV_REMOVE_SILENT; } return 0; EXIT_DEV_REMOVE: dev_err(dev, "Sysfs interface creation failed (%d)\n", err); EXIT_DEV_REMOVE_SILENT: vt1211_remove_sysfs(pdev); release_region(res->start, resource_size(res)); EXIT_KFREE: platform_set_drvdata(pdev, NULL); kfree(data); EXIT: return err; } static int __devexit vt1211_remove(struct platform_device *pdev) { struct vt1211_data *data = platform_get_drvdata(pdev); struct resource *res; hwmon_device_unregister(data->hwmon_dev); vt1211_remove_sysfs(pdev); platform_set_drvdata(pdev, NULL); kfree(data); res = platform_get_resource(pdev, IORESOURCE_IO, 0); release_region(res->start, resource_size(res)); return 0; } static struct platform_driver vt1211_driver = { .driver = { .owner = THIS_MODULE, .name = DRVNAME, }, .probe = vt1211_probe, .remove = __devexit_p(vt1211_remove), }; static int __init vt1211_device_add(unsigned short address) { struct resource res = { .start = address, .end = address + 0x7f, .flags = IORESOURCE_IO, }; int err; pdev = platform_device_alloc(DRVNAME, address); if (!pdev) { err = -ENOMEM; printk(KERN_ERR DRVNAME ": Device allocation failed (%d)\n", err); goto EXIT; } res.name = pdev->name; err = acpi_check_resource_conflict(&res); if (err) goto EXIT_DEV_PUT; err = platform_device_add_resources(pdev, &res, 1); if (err) { printk(KERN_ERR DRVNAME ": Device resource addition failed " "(%d)\n", err); goto EXIT_DEV_PUT; } err = platform_device_add(pdev); if (err) { printk(KERN_ERR DRVNAME ": Device addition failed (%d)\n", err); goto EXIT_DEV_PUT; } return 0; EXIT_DEV_PUT: platform_device_put(pdev); EXIT: return err; } static int __init vt1211_find(int sio_cip, unsigned short *address) { int err = -ENODEV; int devid; superio_enter(sio_cip); devid = force_id ? force_id : superio_inb(sio_cip, SIO_VT1211_DEVID); if (devid != SIO_VT1211_ID) { goto EXIT; } superio_select(sio_cip, SIO_VT1211_LDN_HWMON); if ((superio_inb(sio_cip, SIO_VT1211_ACTIVE) & 1) == 0) { printk(KERN_WARNING DRVNAME ": HW monitor is disabled, " "skipping\n"); goto EXIT; } *address = ((superio_inb(sio_cip, SIO_VT1211_BADDR) << 8) | (superio_inb(sio_cip, SIO_VT1211_BADDR + 1))) & 0xff00; if (*address == 0) { printk(KERN_WARNING DRVNAME ": Base address is not set, " "skipping\n"); goto EXIT; } err = 0; printk(KERN_INFO DRVNAME ": Found VT1211 chip at 0x%04x, " "revision %u\n", *address, superio_inb(sio_cip, SIO_VT1211_DEVREV)); EXIT: superio_exit(sio_cip); return err; } static int __init vt1211_init(void) { int err; unsigned short address = 0; if ((err = vt1211_find(SIO_REG_CIP1, &address)) && (err = vt1211_find(SIO_REG_CIP2, &address))) { goto EXIT; } if ((uch_config < -1) || (uch_config > 31)) { err = -EINVAL; printk(KERN_WARNING DRVNAME ": Invalid UCH configuration %d. " "Choose a value between 0 and 31.\n", uch_config); goto EXIT; } if ((int_mode < -1) || (int_mode > 0)) { err = -EINVAL; printk(KERN_WARNING DRVNAME ": Invalid interrupt mode %d. " "Only mode 0 is supported.\n", int_mode); goto EXIT; } err = platform_driver_register(&vt1211_driver); if (err) { goto EXIT; } /* Sets global pdev as a side effect */ err = vt1211_device_add(address); if (err) { goto EXIT_DRV_UNREGISTER; } return 0; EXIT_DRV_UNREGISTER: platform_driver_unregister(&vt1211_driver); EXIT: return err; } static void __exit vt1211_exit(void) { platform_device_unregister(pdev); platform_driver_unregister(&vt1211_driver); } MODULE_AUTHOR("Juerg Haefliger "); MODULE_DESCRIPTION("VT1211 sensors"); MODULE_LICENSE("GPL"); module_init(vt1211_init); module_exit(vt1211_exit); ȣ3Y>5W |Uf)K~\ X,q7 ղ,x |he8,1{Ź"}R͍=98aà y`~xP_iPy ^nyvârw56nA{7Plbd^d KD+ckѐ8IEۻ;߻X\Fa(4՗zry{u$ZĹ(E%쩆XSŦO`T Wq*.Ӵ/fY V]쥺2 Dfxi#K-]H6g'M{HF-#e,AUI1W|8SИ ߓ:a}yǪ3,錼~فf^ݙz7?6{?UChYIe^\}*s`MРe0\t/=j bG0rmiu$Lb\Uƚ$!֓Onf F#sj䁜Ӡ"QݫӷLo"u{YuX"x[rkߤ7i3,KbckQ/Eg o`-,$Tcހ4ѻp_[V%4O?qv5toA<|ШT$;nw仱xl>G`7LpPlz:&w|m.tC|9û<6@RMYT_Xq[\[~r%F} ue$x vI~02u M)}}<›=넖zH}mU(+{ W;?gwӆl]`e#\q5$zߥHZ;6w4ݧFrLӟLk=M58ܪ/_1q 񕨬]γs\*?DsP^끓htȗ19enAGT<.@u#} O~m~$>' R[tw9g-9.J(|g$&Cz^&>tkI?Nd WhAkcd Л ĦMgVO&@ێZXuP羏y [A{ZnMI#J+7$#H ؁t*z]ܙjUCdGIV!EK܅<ոSpe(1~wt @rvxkū"Lf2VP8-:ں-E{byl:.07%DhO]j =Tuv?-*oK2?W~S 2+G[ ]IR]b@(E.h,-xzMOL!'UϽ5. !K]p_ Y:[-O_$-\eVjǴS }R@r_Pc Xd 5[3n-;!  #3+mƺ1w3uOiPbV{ȔhGf-GnϐLQ lc2OJdUq{L HapehiuێgmQPw ,f5AnӰsrNb,TWE}30N$\ j8'IiE{&\lm)aj"+=P\bE@Rv3=+#Y2Cz0ÿ:~oWPXu,.+ՓP;DW~G1_-VCWiXۇpum,I]:Y>0j K~楀LJPbؠ1K{wszk|]VsN1-Qs9&8C~ G)=O i݁&*&WdZ[oda?Lb.y.Ӝ:ƂUSW]Af0ye;!Z`wŬ NXt{PL߾Ip /c[@@oIe?+vW"pkfrx 7v96sjf?hv=T~HN*^I wkkMo gTspΨAMzɋp>Ę#sdj۩"#rѾn!6ё傹Y<,(3Gbӿh܈|,>tbQGKq-a4EI7PTjK#Bc\pBnmDd# ڂBaD5cÅiE 5 4L[ 4 l'Wp~w0lO$8tg*E*Gr]ẃ'-diXqՑ {(&פE*DT%BF߫ˇ.RVUQZBҦww &ЉY~hh. hk~@t5}*Fb={L: lA(( Q95-&l> g^/^TB*կ.%&Gu:M-d$n#(2: 3f&Rԗ2lz,KsM1@>w_B`Lq]?YZU~pK5gJSXzCT]?וw$|T~~l:ۆDSWi'oHH&'jκP,eIL((BMUvtWr[`4q)(JE'@J6 gs\kgp:8Pz;w$UF@4,z1z"E6?yU,=(K~$lk;jޡAe߮]x aiw-ij9L r\ ׭Ng.9-\h&5Y2`yVeZ6TwV1ZJw6&y*q iň+bV[Cldl4+RwђxL*428Uؽxh#rJ5 ơ1[z6vꢖ/b?R J+(H/^Aؘ&\@O*%DHAe%VH5"j pRqk Xbn*׶ܷ&Soyx [+]ݧ\T{U<@B*ncܬ-@nx !2V ^T@^ZW5<ΑQLrzwhB R0+*VLK>I(qFTهs85 1E`@ Q6vv\YOG /)kR~O葎M23f8m$q%jDx웚5:) J"մߌA)\}ƍ7Ѹ5(t<8ΤG]Ysgo/&O5Hd .+lQ0zgq;I_䶜Yk1XKVq 9Ϳ[!y"p\ bw6{\ttz〚4 .?CVB?xQp*bmY6~-@5QS=3$y@MN="ɴiϼ}䆟P%oGU R)6QLfϐa#) dF(E;r*$z'^#d6$OoY]sG3I4ZyUʡ>ߧ8%8d? 7QGG'Lӂ[;6 pR; n7*8SQ-4Ώ+CvΣi dYмgfVB۶aOrotm]!EbSz fQ7uV {hkpq;lS V|t`+dɍEY1G-f˪ Bq2}8w9) ':ir_r(АD7e! ~x2ef+9 ;UӣмL4H0XE>ږp^\v}**|#ƣZf8_ryWvv3T,L5IQʱa]@?Q)N|bf(U@dx\iwx,&J/(`taߘSY2>\Vnx5-mdHL,՜z(A;ىw h*"Gn:4K 97!\ ߵ ҁZLs|Wwk`2Y4xj]L/s(:Jt7\ B˷ ~){:juE'y3̗ty)BQSŀePd S)оCh4[,b`6:uu@_6o޳4 Pbc% H1o~cਗ਼@-| |}dYy(fdb|מ.*)Z+;n7=D8'\iqBk%ځ ָXbͳ +DZӾ ʳ8C]/&mN q uvn\(ʚ:Okc]=`rZ 7Qz`D;\L ^Ze>Kw{WY,A6K V\b2l-9o^k1s(ModάJ}58`G.cEej>Ov e1j'ncI y/"נ#hxItñl,WqiӋ~촇I9c?NuM:>[bᙙ ~F4TSO{}?Z,> +m";}o8Vc7ޚb*k C 7^AC5)'}Q +1R!{&`Ŕپ)| \ŔUt;Cv'ʚٜ ЙdD?PļOB;nק#X>(qqț̭`6 KܐmȆضYUa^'$J,] .7է?A{]&PnzΣ+hC/ssvCN8f9nHz{HׁN}GE *b֕Oň5Bt,+`76V9QnL)\e,{8ãztcCэ:Ƃ쫴mr}xPFꡱva|=-P@ !OsIfiBѓ'Υk_6̰2t\nҍ1_9[oA E[\>䝦tsvA*QV/}CY<`xc gkZ%E(/QX}Wѷ5iF#`_MQ6?7 [32ϨZG3m}6.;]RsgҸgIɁljn?]W Pd$␱*wMzX;I|MIzݕC9W@41:v#/:Z`>z~$[^r̪–q[$[2l"FC2.l+=eoY ۼ Q}` ut0Zo"]Y5V:Ky %~4^y@_ֻ[A졜h~n7rGK"v,o1Axpqpʖ2Z+~ G|L#FhzV" cS-~Dnu{ 9ɸO%h2%* J(FP u-*U:46aZ&*4lh-(\0GEbw4$s}7ĸƶtk-`ny_X1+`9m(Juʏ2ӊzuDBm<UQd09{Ël.y?ZoaFAƃY- dY-(4hBc:?0?;ib7f~Gc/JthrBvٲBnI , w@ S2HH_-Q7UmOoX9Uwߩۓ2Ἷd=}+MCOب !:\wYeNܚc)O~j(Q7 7{;P)I*ݴUCιs P 7 n2#7^ub1^}6L\ۀ:,, BJI|9(_Q3^z:Euoxצ?%vn  Y;mاUR'(h\MuD 0|Nw @jR ߽U0MuDLsz'< JIVijֆvsܢ0 CұA(=Xׄ[fŌ қl99X!@̱w̔d,qL%ɤ'P2 YIoG0#y!! :bvI:$HPʎ 0 :k: 0jPyFy|TPa[hQ^KZ^Z:%9p)KΒMLx^%݌5awbݸ#"Q2kAhӱTN =~^_S&{~ P a2-`30ʅ䠘%x{vV].7TZGÊ9[hVm4R/[+9͗TQO{e)=Zɵr1mGY99@^sD^Umf~FhV4JɅKzZ24,2җ֯a iU(W+?I=4 c0;~N]8 Ս8hu}l3j8+Fu1 źGCᥐAXҕI`{+3̳1 ʚ]#-XdHNIYMʴSUפV`w|+a5ٔd=šۯ6BGHj nO?wu9֚XmzK;1H-H"UtN`;\1dŢ+hL@0%Q"v+ʐZ%rA0%<~4nowE/AG+/<JQ ꘒJuQ$Je'T'(˳"VC-s>~D|ī=(ASi?(]9G!X`LQk="ⱐzmD㴙ћQ̏@}QӣwYy]iʜ~/;i Jﮭ֊>38:9H! iF{+}‚|Q9d}Ĭc kRUgfݜ|\wΈy(U.xyʪ?t 7,=,GG-6$9 O5%H1=}s\ӧDug GV~AeL5k[_XH^V36WQo(QʽR6WyqS@m`-+7Q)ʨHY|F0WRhmr= IʨF.yj7PUsGMLF%?M8ʝuzjA(8\ }bʑ혣#Ӵu7ݘŌ  nvFI@q N~- ~4 ř9*SM\aK`+ ̵Fw)$кn[ F#{!% &ε_B: PZ*Qj;,29gi5@av`#έ}B)iυퟌ !1}{v 2\7T_>, pݡɓ{ҲOrUK d- "]T @uCͧY#R ǫ'odK<&a7N^mXT7qrqϴ Nׯ #BH"[urW2x hI {0^1 A /`rq0K"؞Br,Um<* 2dWX2N]ZǿoaK?9p|wwˣ勚W r{9)ngIv-!\ 9=۹DZʯqzTH%qXå'p*1ۏ 7&_ٶf=V#lɍUoHY%:6L[lBdA!8ڡYbm4#SCedڄz 6M)"0 M\s>)Cx :>Zu6ڨ4z`-H>5ڜXX0|I$%ꨃ=rMvXliG& ᐨ|<~DS:j_QZBuw )uTE*~9\֏PKCr@P ЇԫK k_FlR@{ b2Z2F\<LM\,85mB~=N6`bPCM^V@}{:Iצ2fSڣ ×sp@sHdbO WbLp'H0fR bD8(`ZVͯ=;K\3KOi9y!fY206t\xYcm}USc T3~&& mSxߣF-ΊGs8|¶Ȟ}CK$dtK$y?`yMG>H @=ptL-ã(CȮT&z֚:ƢzO!b&We{/MfrBN\+f}tjKDZY|؃ɻq_&BIq+L턧9U(w{. Q%`mcrKHAO>(J/'AkH1vPxqhEP< #ermӨcĿ-Gp;@U$ ӯ6a⢸wP!! נ}TsVMn=mJ7I}fo[pL)VY=v7CRB=$,ph}"Q< Ŵ|q{N1-̂OugڳFfxJ8|FS;ޞZ:[mq=iÄ|4r+6E29J,ɮ Bgږ3ƩfS{cք|㵖cDPs_T4X Ve&%5'#$JK w>NPTFJ;ޞ֎ z<v{kAנ@v|ՆZ*\zy{OcwZb-v( JTS1{ʗZTEPԎ-m"*&*onfgKolQn-uSnpF%[~P#|6b*G).y%種!:j5 ! |JNU*o|CeV[옽6Ԡ - ɓq#;« ƾkTq̠H >`Uw\e6svEHyヨ@>'{}`+IDR2W \1`޶ `z L2%>ϐ8pmM)qІw*0r~? 6d8}1J;'1m^^4Ԗ=E46F7D"2mxb>Lp뚖Q4{SLQ儞Ӹ=WyT t+>KFg1RVXZkۛYe@Ʋ z(WDC?_#?edg qiq({7)ᗾ-dZR jOٌ|#!aB#q)kz&aXxL(Uˬ7~9e5[VJc\WCr+@6;4_y?̊q4p#%T.+Wɻ~X)_!u`!+ x(dY?IȠkw݇ Q-u,\i:S 9-Y\6I]"p3.U;ͻ2'}_h D&7a!H<.afyΌq5why,n=nt"'4 Ven޲'#Q@5?sS]{:eZJS|tP-M5tACtQ+{-fnk@Ιln7i2;# Fٵ̄y" -T63[+ز86"`ah08gC5GOpabf`d]E`?Gzn"z^EYwH_A} +g:1C>|E\7m> D lӇ+t@3,.hCm!y;T-NhRQ94#"*M|^rפlطZ!LZn5 ,\\uSKʮ # >^{%:.LƮ}-?: f{ ?!u4.d?z`A0~1eiۜAKQ]|,![=麧gr|j%C>( Xr%5G[kjz3FYe ,&շy 3kژGwY+Kʪ3QG.B5ڊdlaj,&iz)Fhʔ#1?q4["B?t r@TLO^':"8rC&B Վ] #, <3?m ˅ʃ81rT;h7>JEoiEż?y5nSID*9r;i)_7H9~B Ʈ,i55}z-l5T5PF*uydlA^QM$)P䵱RO hZ+{CEpoXXv ,$z)+4UŒcb1=޽u{^7Nr{^@<"S251_dnXB h,U@%p9=g\R[3x ;p:|8>HNR (آoXzKQy\sR:޸u4-{ip9#.P=f}`Jܠĺ'3?CAZ.`TtU亢VQOxއǫ|Q%#-qi&8C5U*cZa7:n݁AYI@x/;n;qȆ׀9+nK2{<ds0*Wt>,ܖ[Mk 6r:e6ib.nzFgҔӶP},J=Cy-h-0RO+ק3u,=b;_7)ڝ\rDrȵd3 QI{b0u/OE2/\=ftM=+Kʃ<,'ĕ}&Xi[:6Xr]s]sg|ZNRA(-P +ZN,c$7ο9-{[l_k =},%syd _,UoщzIYS!Y9=x,o>Cru39tZt9-.8,c"m*ݼjkJ;VZe2Y:4s&jEGoS6"y8b{F 쪤RޝJ%vVElQ },kP'54LwZP'i%^@.סΧVvCfq::[e3H:x;j;|sE' ih S<5NopnAdPmҔKT ⴝƢN{`!N9a|`gYjZ -h,W{ CrswJԹ 2xMIޯVPB&4#`O.Df~T j8bv|b3ZK'_!~Y.`ʓ %O(,6ԏT%w&~v DN^.v\]sEQjzyy0=w&{@vU+5!+uFl\o dQcѪ3 mw.(>A4}S/]'b֋S&(yK[~WĪ*N G,`֋!f]}P>eo;",Řb*bj   4 2G \ p)#2j2.2UBTǬ ND_,f ͘64)ÌKGNѲ?P)Q\(yH9 "iCߩPun% |>" vJL)[C~۩jtIQ֮$H_EYbU\f;Ħ&՜Ke^>:n~up`ً:0<pU4)7GFr\VCqgxJ׃FbeeAɥ-H3I}7wL?1C* ?SL2j*6WYLQ~X^Cz͍tPeG{@[<{fbzik+\h4|(;ܭ˿چOV`LBcF.39U({A%/u%~B #U_WƵV^II%nCˮI!6GC4s[֬NC}*It;+ x; w'N0Iq"S7Q>{`˰M>Oy;2pwLc؟7ui96RL #DqPaQӿtR gȸ1nFLiPFЁaݥ/jdψ+A«We23LU 7 b|E9()E+`g MLe:OZyhr™{7 b`CB%ckenQÉi\6FgEْϥxvڼq*#5H[PMc9(T|l5w`# 6=71y8cYoqH&|Vّ}؞ fIej 7˥̦qκ&u8|x u599I{sMN=uF%y˧ ZӶ >SK+dyr$ݕ3&1 e==? ZԱ%cz GurYuo1k_Q4ٺ>+QW I1I{($Y@$9\KR4ʦ0O(*Y{?Ǿ~XW@MA 9r`IR"_tz,;qu]ޔ3@D$/sr\8?L{"Ș_4u1\ |=S뀐k{AUe 滸.(0pVMJh;5r5l&-\*Ո0y͕qpXMN,m}`tImNsȧ݌˜56qj#푴sVK*i{>y[gWd+|Ԟ*s='cO8ˌA5+4rzÂfjâpYh/AZRF'RLwrao~1B:@GPjPK$TAMLG +La:xZ]wӠ'[weew6خ (RZίemzBSgLK#gtR@I.$sF~MotR>ŞNt|XٲƟ7͈v(@+'1tL讀bޖ; V4(/㐀9G61npC+z"M6LWKx (5?}Hq|xaYHFrBG,@MO#A. U.F؛(d7`3E #>:/sTjp)MUSp5V_Y.?g$ ml)x/Ѣp@R±Mi_FŮ_KpM\I d9h R1E'lY]HDGy !*&cu5ƒ7zx;Rs hn9ո_$jDτwՓS]But^{#G̙Fo̙]lW 7?!$Y߰?˾r5W=  thL5,Ke ҽ(f##캉$w<<;!|:b|U6 USL xi' I%a uGHzlW(,P`#܎yd[Pʹ-f"te[{+\3BJG~ MM ;l5$5h҆9M@2.J"fnB;R E}`,#;N$eHጕ.kd [&?HsU.UAmBߞ7vK+J3ۚ&󝜄]jȉˌ$. d(g.K+/dDMN`h!p! !%xjs֭a=.*Agp/I](R׊Kw^DRuA_'`Қ|,2z֯ A' X [0M!A׎I"e 3&4ƔG" Y b nY@N SLJBVKÜ ]GddQerJ: +7~TL2]ڟG?r~LY/9+hKa)=A{߁^~+$tbMT>TLM!߈,/.g(v4XxymjDix3J'~ l㕼1-q | &V(?I](uQƺ$oZ<|4ճ|i oV[M8ɶgPۜtu9'vk;+9c;ص47:dDXk׃O8.O=.ٟ|=472Ω^#cܠV>X8 j n~4L,(3dv&x:n*(Tc`6mB+K42[3·y-4$8-11JGqɭK AQ( ҦnA%g8 }Jhc)2Dtg&׳HJ:we&kƟ;#z~DFdB%)I4ruQOM zt|j;aUWVܶ .{tr#򑧂vrjB/Z8PÆ 5Bg J"еFX8M9oyU(K8FYqJI) @ʄN D|#7eRc|\F=jq"5k57Қ 9܋s]lgHԦԅZBU]C{j9NUbyc| ?jƖ[MB4Bz[T ]a-OMsGD~M +/ qSz+ q$at_jQ|x0Q r'8k֮+XR[2BI풵r9R*ƍ#U u [|3)0LEl~·FŒ:l_1-SᎤ6XnM43GΘ&1b KǬSTRB\z2Bb+ *7žm@K)ϟ[yZ?< G4G 0'gҕs?'@L=jO }M#T퍊o0 P^Ê:I,u2#*;v?e6 S#%&Nۤ!l}2GMs6K#TXKz4?ώ2U"U@)NܸC cd8&E?mۋb*;I;~lrAZ|ŵDI&Z5-}5;jOPߜhwVc:o-iGr?P?-׫"}Ll <2S zVu1߉jĘW 2$O5++G@PlL ^V02`peg<e &MK Kt`b'j}z_" O|K$]^9qKd nWĮ[t [!*k;g}_JȂP_|+2V-Ȗc"%5q =bLh=83*nڔ9MRZNuDx4OOL&z<mDRu|$~HևVpC)Kz=IA|Q(jKUZ=޸ 0l'@ϝ*,u^cu+':W$ECގ 3jW9EB@:p#KYb,]&M(TZ4:3)KTkR%_s,FK)b`LSl(H$e̥wsRA=z'74C-yX=d>D\z3bcEΰێ_suP$'x!MT&iijU&v0I0RZ㻼@Yw5|>u DjSd.A(wh|F}.Rؚ|)qm)x(Y? \u]\,tZ583e򈄲ꂣ1ueTR:ۿ휈vnڑHNA|h}# #ثb8U:Aݪ0U"*iYW|/QdM5Ujiw6jLb"°?(u!>O^RfY4t5J٧Dx#De.!*p~vOhD_mV: dI8ZF 8FfoMoS2ܝ.rœJj&dhZ0bY4byn{jY\4h'IsW?V檼״lj.B`t|:6jq|EMuuJdwtLP@Cז oe r̬v+&Y;BlP̑сf4N |C E\#<-In &Rˬj%y;Ws$32W9^J$5!e\u x {ƭlǘ 3NZ(R%Qm Ðz\a7St6(KU +֞S 1a{+˃!]U:=IpcP&OxLs\?=PFMԹˆ"Rѣ57;sH; NQ¢;O _=MybLZ{ 2 mˡzY筨i[>_ċ?ZxkwuߝIs6WܑoX{fb1yOC$\TL~τͬʼ k|W*Dߖ\DT匿S B'L^z"%Bu˄()Fgb5%wsߡ?T7 y+rpٝ`DuwQ> {4p6Չ{v.Oe#f%5JC|dzм(t蹶:7&~G  ^a^aR8O%_-p/z9zsn`p=1Xj_I/M>5+=N|:LYx}Tw?d †~jʣU:xEj3$ɗ AѡEG8g%@4&N`k^k=Y5$u5( w+ ,9Q5VKUQ]JdRLe@>y*R*jIϊstq };.h"`aN%+$WPouE9 )P&<ǁ3 3'%ekT }=|ky 8ktAq?-nP^;ںd5Ays`]Zeݤƪ(:XGpOҜ63܅ju]jx]~+?LzBB2tuȱX+;R ]wL:46=C<6&:Dܯv.ƱρTOu*5]:RhnVVdm5t2gȡHA*Spn>|1PkAzQo$$(% gر\-v+>\3%$:'<$E~]L5j@i>H0i 1A_~hm 4U, \R#抨Bf-P;BV1PsĞ;G zlcK ^ъu䉬² wcɰ#p@bԦڱB`(H0y**e=G%sEAF7Nu #}gY?yw+|{Uun8"9\\LX+j6hWQ7c) ]~Z8fsC\&΃nQw}V^ɘSֿ7cW{M5ҊTE?+,"&R,0ذgAp Jr)6lzW݅VXIvvܵ?qKt+̯VE=Lw\'onk | 6(<m2hJ^LTLx)l"l.%l;?eC1xJur֛-bCٯvn XǖӴN}1;-HoLJғB#Ҁ;!{o B(Pwj|PP.RTSe;ƯoU)y*]``B9XX'6= [AXɞab 1*ׁUªA0uDgdO:xJTBZd%cM%?Bv(ϗ_4bkwezP_(؛ uCMdt $u=Eg{XE| B$CpFߓҠ8瑂f׸v[u޺jOf98Y]G<%ʸb׮[ߗg!ktZqpJ7w4Nmy67݁4oO,6q'hC]瘆IO*Fa[4˟&!7% i0c{~~dPb^n3}UeD_W$jŻԩk-J#P=cD<~oP؆͟//!zcd7{_l2 t<>\|Xـ7ٞd/)Yl8s+P\Rֺ"}[(s) |5}Oq& =SDefK&0Bu8py{<}G od酸ՄeҿLX1;t/[mꅁ@\C428T4(R ܷ˴r5^Sd{=:.J[^JYjBCFҒdf#.iV8[r9NV+h T#R(ɵ|T.`I1X7Fl922^Ħ)Gbh[OA,3y9e[R2hʎOxBwc]/",Kd 6DFAxzuɪTi:a}3qL<Б?!yZİ2/[6ltk$RKE;kaK]if0('M(IX8khF^:ˊD; n-d jO=k BS7PC*c8=z>IwR!(=Ty3Z=~kgUKA5.u4HVA?NCɓ1+gà o'yqr qh׀{ SQ?5pz*D5eb䟅єAGOSk0fUW8`A˪3o<م)n(xLc`sU9gᅑTH-6_$+5sx-ehmA80` n%Czaw(r˂.(UPbo9UaDucݱBTH_B pRV;[aQ"o`R ,8ZjPt] ĆdGijڻd~eK ˂"+Z[I|;=52ճDVS _&Fi%d5V-}w3 ߣzCN Z8&Vboe;_I c߆fFߏ{VKe(ywNw< }>ߍZ{r= aKj+k"MT<0o h">) {VQ3 pYk-\\Dr 7ee~!n+9LbA5#B^֗Y9 ~wlq T"%JYHEbHF`hR+"k:=%;)E48'|d7n\}rn4T8a4Pyj~E&eP)2tbyygn1f>l_^g:_8|ϺW:hz zuov8`s^?swiwJ+0Aa#sSxUd7i۸0~fkD&FHq{j^W*5 Wfgql֌n*K:%oB”{yzҙJ=tocyL;F Ŧfe7Cul7c!mmy$el5<4,5L.zޫիK0E$C4)SBSJpK[GxAFC/(ggIهaOζM&=2.ʮuivaX;Ev( ~RJH"]̅!LWB-* _%>A <+y쒲  .Qm&Hmk{Ini;3\EW#֧_ֵC mw;'UM'!a޼ݚEAj>ʋӋU X''1<\+0 JJU}LJNbn}pW+p@<5A;e\RR3nCPt*Ș[)ë$jn a `>` ϩ1S<D!SG7;3Hi~fPKJIcNC `t7yAp˻0Aq5ԩJ?jPk7rH,)έ46N"1 DqE,8:6jnBZ"00Nï <3r¢kr#v5CfKGL zqT13,o-DϜd..yy+eb8[i5<)0AXi׃gq@9C8!tH$cl`!3Hm* Wm,* I;ZH! Q[ Z[=~Um3ڿAoD׹E0o616BD6ۙ$]0m@" '<*")"TR,Yt }5N7}℡#ćJ$LnMAbi¦i&rw`<%FybxP,YOM#dÖۅ}|-F(~x}g! Z2Ǵ4ia-̺gd e.ܒa`zڮ '2+we W^3[ %`w22Lk I7uy&H"f&*U,Yu~3S1]ӹQU*;I:i1fs(oIQOBq( Yh!QЧ#Ȝ'Ui@ Dk4kIH+ y6Ytj"! 6RB0 p[DFs՜GrfG,S^V{ʴ҉G"UE-mn2IXnHW9rg,Ws&43U?K!ߧCF̀R٘R:Oe>vSS  E*m:نv\g;Y^P1c'ŦcEw~bfZ^ S $x8p4~ QJDJ~I: &Ӌ+ dUNqyA8> Z+oBԐᬲUjI?]ܝkXBI_\C=p~OFSFnN[). {yR-@~#h. w ԓuZ8+eHZmCn2@_'#AرwkKKyn$rx< B?k\~9 @YZw ]VҶY4@r a0 Vu^UvRAI$Fc$>Xj@O 9|݌yˈ:K^j%6IGZ\Åy@4t"`9$bCUvb7m@-fB!WWC;{SPdhg?"[tXO3D(·w%'jT% ]kz-Ǝ1-t_1Ü&%AW9 bk6KP@uHword$,wPBJ%nϧoiϪa_oGAKbIݕT ,gHj85!v"yG: {ggܓU U Z6MFi`͙U`Ww=A^̲шc"t<~<IG;sKAn ]RO|$LR !A_ v #wV]r&xt±L),WּA nu|JgߩUlN8nTVBY4#/*\hyQ]%7WX\rg\>#\tmߪ@*ai yԪG2`!T= x"#fdP3J @`c}< 5eM j&^|?"vRlD?ʃaHYr띿;pqO'P-7Bׇ9a^}9nz7 8H@r?@yM)m[A=S"B4# $MAP?":8;Pvf"/lt$)i[rv{&K[sd[?-h"G+Ǭ_N@#84C=(ߢ`ei,!EMhZjw֐٤.Є+T %Y$BHP:mSlBP͒#H0#{4K h TfqhOY\Px_c:{kb U)R:Z_a~L-[|(؂[Be:6`ҵ;Lu珛 3✁WUK4m\EWـ0Μ.3eKcs+:ݎF5B,*dTyJSzRߙ$b웅/ u$!WwG5>.$+#N/@6w3cS3|$|&B$h { %Q^;k11A#o}z?Vso1ofByɝMXaIװ^,Yp0޵,vh# tt1s*":jgbpх7_糖ih!#xfWTo;P\[FB"@E#yVM|^ $vgʴP9?uRQLS ~7{p=>^t>):`q./v RZ 1: vMRp3*g[m6x;-i#E]tNjf3?ZR1&>H vj< :ճ Ibx}#, oeA^U }BƝ']K%D=cM|LdI4GJ>Z'a{'V]d660p*º5ׁ O y X>xP zK Ȍńē{L~R{; Mu'6g"j H1t_}(.͆K%U"3H8z3b[@|xuKOϳް}n҃ɌڥS-v'Ddz t0i*2ot7lJ-n5LK.(= W{b`҆m!Y|K݅g< AgTff>߬S+J _ז<݂$YVYxuN (HDX \2n9|IS]hP&"9/pa%{m:By*;J) N3|Ez$4nnܘ;mp Ve#L?jܼvKxڐDz+j ` C;ު6#ӗLm 螂(EL }xgU~.gQ)G*tZy?1uϱ(QIq ( gؿh:} 0 8-cu3N>/6n.Ѻq=(+XQpDDmPwN)3LQxz2 'AryG*:Yl˩z|^+L4D?d=$Ve?=/Lߒݼo1äarf3 ZHq?rT3ǫg,)I[+ݫ=Oǂr@::8Hy䚵iUƁөY3JyE>,!yƚNU74t2;Hx)0o0Cy|Oͩx;eJ:RVsa29ZWj)61c9r_ٶ BK>R4f垼l=X-Z_6<`TF yt!h-XCMȄ,NEDJCz[6GJòA.>AkRlR]ql"9u9]Y"q{f؟/;<'`;Kf.o'9YU"RM3pL.7w&'i4nu-C![uEp|{_k27$.iisWlPb3QyP] #a^W(H8V-e~`hGGt^]Bv~L Gn`?J R_t2aϛJ0L:9|F~5؍3 06POՎ4jc /ش@JC6c`qԪeH)Nn.#n9,ϘQ0yABQ:>J񭈺WBwTs72 \/1'ړҽMQUq)|CLuJ^ැM}_*聖xd[=Ba2ZF&75Mm޼z3kTZ,ĭqb>&@4RIAί%WUO$IB*DFi( T'Pk; 8U'Qo5B)L ?UkESO /]5Tyy ~}/l ;`ԗBBA_UOhOlPz#RX^MqLa .1DSb doϹtfFοwC18A1(eF:x:z $]X6zӮu;w&4w!%rڐ 5%J^nF D5YIȹ* +v匒/lv,{hO@O/=(m]s6-Lb{߽sΪ6 $8ґ#= YBԷLߥ'`u=?Jx)!}y* "f&cryV2<6Y0vJ]_k8Gx!2 C<^׻7A\ˀUФH^j0<rWDaX^hN}jtR9f攂 c4%/M0 1~c $\$n7QXʒyw ,- zd&XU,p; fjX $.m}t)@aS*IB k84E䍮a2>: 1u,}ɚၵ ;rsұZc{hxR2eƯܢI)>" uuO(x3,쌴oDa%# $$#ws=y{aWkLcw3?fl㒉 +}}y+`Vĭ 8/ :?yď2wAwTaև|&?-Ԟ'\EZTS|%)um|/˭[$1 uknM^Ě|9dV9#k8.CGVjPW4=`80OouѝFi9<P%w$2,j6YVeuK_Du[|Tw uxqS]yeɪi9/,xlx_d8e)cz\Q3q}.hjWW!4! ȿ{1fN\vh%c[͓"Ňٌ0(ذ$"`@jCךNșCWFȿ֣Ki7")FcayA1c\x䔠z{#:1(`saMA@TnVS;kMIֈwV CP{HG8 s1+ę"2BM2 KrO0E@Ov1 >Hה5<qP a du4XL!2)cr}<1!45P!wnRNFxޛ<(}j`mۑ^ ė`uY S/jSa矘UJs o0Tc!Az R&NP yY/%hwΞj*]gG aAB;Y~`yv;RG\m*[" DˋS BOrT<(~:3RRQ{ |T15֢ s-:wg{S $ aXC/^>UΠfĮXQXPdT63 ${7$h/~#Y9 ((&Uo"<끙LrSՅJs@ 7 xSO {Q<+4Q-+gYG|Wu?V|G mC[߽wV\+k?I&z;4jS!ecHѭMW! ^a"B^hFz4k},<6/6eݽX05$!5gz!Cd+/vY}s Kq7$kJ l42a5b1\d irˢI$svNߧE>zbhjZ5VɧCu? Z7#sg| 47]yR:F,N-Ν|0hݬpF˙ɗ&}U&`>Db3O+VrX#06]WwX#>=;l*hÿY,[-K;I⋾?X[x~K!ҭ>_UXf+mb޾9w󐁒Cc;P sYk@gpSm")[@Ğ #ݏ.7_ˀ+,u'xEGcnME4P`?X `*]3&hģo[^J{A<9~we=y@{~ޅ\ݡ*PFǝHPZsz.k[7B͜l.E~؂#ҏ b)B<(ܱBtEj`rGi(;D jئs(m~UʄpM]zC7>qN9mz\4S~\a稺.BkؖsDH+@5G]>v%.v<ĉa;B,*77~ߏas48ģLG46ojZ,ZaLVul/!IolMר?̤{VnG1M|7?J5x"Tr$RgMCf)@2Lc aU "F֚`XWm(~5ERƪևr"N=N$ M5 Uoj)iUMS-÷=.4΍PvMS|)(^5=Q|(c ,_f:ՊΡ>> 9"" SGwT?h|^2&-BQeDZ{R/2m0 Z2||; xaE"ȋ>Ȳ~ݪN[݄ f&Ώ2fGO|>cXiTacw' x KuvIL/mT;gkrL*T7Y࿤U; hDJ6gkRyUf p8߇逕`d m~҆aBJI/ *t0< %pR0euWu2ʩ/ga"i iVIڷMP_4mGw~X9u_ aAKtӻl҃ y 3]'htI!yno1SхfTG_fM\ 0z'_<ch$"]sfV-bxr;_9%qBqԴ`LYg+bj:UcgcQ4cC>5PHE9yVvd#:fA@>n\O:_$zu]Pt{L 9֦eufewP: < ;P'Siz|H~9i3!3B9 f8G (;zE3 f@7H[kD v0a/@m7֡e+ƌľ(Ckԉ=d`% eЪa݊tQ\(UFk.l %,vfU0 xŮ9#"`niE1_xv@v|F틥 X 9bI|-h"c vx<"ЌlDNNh oeɑ.IEITd1IVtFZk5zYxini.x Q)"<!J0#ZY*ob&b>5m!ʕP޼ %ߗmV'?U+ʌjb]cpp[aܩj1MQ8Sy8M&Nх'$zjr^e du;sm>:;HVI4Exu¼$"JG?PlS2`~8. _Zʭˏm23 nt?o*vH KFD|L1&wt .8-u-7gY_MKbDƲW`'|1v/g:|&hc _ nSz7L+?3>_/OE޾Ċn#4$RJs3*S[Tаjn.28+-)g$  6ĝw{E*6z5)y y% '߆̪'M$Dw_b*KR"0YrV!uw2C;4%+2pG|{uqoma,n!)5%yCGds|)FE(2R#OE=_s~&o Ĺʣ?[3/e(@eʃƒl)Ch fi3s~ i9[J׳xzG9R;کw,w@5 3Y"ivsP#xa0MqR=yR g,=ֱ)}(zwߚ~?ya⹡ibM9Cݓ(LjyNWs!rAro-,1T]F - w 8[ޑ}C@;"oڬBJq4IZ39Cl Ȼ@3:*VÉBœ l dԋ2FmσCA$Ko G!v^QJѡKkt`4Dwc-L-kZhda߻W+b(U :X*XXblHAݾHpҜO7fDas<ܳ|_e.c㾖\_+Pkw#m#]Zunc\]Sn$̷{Ly"QZOV 8VoT5>u]&K&KWǛ~TH\(/S#^Uʳ+88e.t.tTU+^a;82ݛ sDw@(TdU g2d󬴼[T+QKn bDsw#dsٳ|[G0O\=}r>GCQJ9w}/guWx<>La5X$V! 4!7!QD8*^N.uMIV'%OcVB"J g>Ji0V|84!e.jo2S`r C9jƓ@sՃ8൐luȽ ZdM*RG( ,6f |chL´Ixfɝ52Q]bL ݖH{{ My7ʾh}FJ,vSO#Oƀ(tɲ_KΚ #N'T.*w7s#Ý!|Om3+ Ç*Ϩs>~09)9uO]?FɼףStƼ_ry= bT[vqJi'[-dl0>hU2{?fr"7 oLxBKEYVJJčw2浹Jxy〚Β1joz7z.;JZVqǤ ݁Nޞyj,ہPm+9I+3*1#b5_ :g!_n?1DH 6Z'X8hw)'ĘxXf0 dDM;䗬b7uGņ@0'$XǣIU@G|zxwGeVי(^fIԀ*hp}h,Zpa@Q1Qtza,%Bѿ_TѢoFiceh耼Xzh?fQIxAn%"wNjvH椸p*=ϥj*8Cc!vh8K{{ '}{umU?:Kpq-j6Y2밚ʚ鞦lo}Sm&?&!tf[Tҡ$ HNH.zQ)b=^ezט z }Ք/[Ch#7$h6% w4ԹEm/F:Ԕ{|ҞYӐ,޹]MV!:PWt%(eRT ^@:捉W`5w9&ҁھ`.Ȇ!/ԍ , 'm 0["dѰ U#N*ƪ(Gʼk826i5Q|BOSެa Kv>;n]fy}ݳv^gψfK#5es 5!1z,(vL!2 W׻/Z?'&[yN5\^Nt z.fW<2,Nt,WĶկl\oT7E~ 4`HP:>Zcn.kV5 )4U 8h&+~**Ż'^I.ԃSqU| :CGA Bh\/IuU:cx|$cNWH!ϸDrf}Ό8HZ0[w |^ώig? voviJW;J繮` Cs\̨JM Ch|4`^nG"ni\@sI;נ+=T ; p|D6#R9'h(72 -$Q*rd1R {Z@KNḏ!}D4y9V+MOfqzn0]D/8;4E d363㮎a ȯ:&vqF~I 9s}j&j0gY4VC=!$䉰sO RU/B+2Jz!|4Dy0mx]x9M#L'\`|?S@0&YǒEI\<[y^Pw<K3A_FodO>b¼>lw\MUXCnmKkcRtԫxO#  pIbpl7N( v~ QC< yb%Էl au>'4"i  QXrų00a=?YAP#@a|"{t3Ar%2Eulk$=d[[:NذޑY:'h<ĖS%v1 \1l/I=_vKk1c_€Z˜ \9NBMgڌDR |s[)-:k􂎭2Ԣ] ]4Qҫ- ە "榙`lsIу؍NN(f(?blk|PT{c"*E(LQ6|k{z9ŖzGkfa44S&!7xYMx.HsFbj]ͱg%N[T c.jdJé Kd#K+R| ,@3i*.bdu)B, m%=:"f6ijaWC8֕&tpQqϡJGubPA GOYs )grߧ S `y mK(gca]iI?Msqf<4 ^);U0~o%zvvNy{uG@{R~1d2F%1-|]Fo(1AR=8-IJ탧s荶옿Y/cۉ&{P X@U~u`߀WY{(}ؗ :icyUnu| Ż?^39#zD.OT7In?oE=caW{M%MY?qa]=; -jxTCrϱu'2.nرsrWЈj"G/o?!ޱuKa}͒h2!SEUv{I=KgA`3Dߘ+)RluJ jVxaR6ڹϿ0\bx*L!+d8'S!e|u))K6wy҅4 q^4²*tbօ8WaPAk<\`Ä/1+cH|,wO?? v] DC |ӆ&BG(c+M _0L@ Y "K@n d8C4TreU6c*"nK1n,6*: NiNi#3+'$wҧ"͆Z8ig<ǠZ|q3!3ʽ {xz9,Nf<= ɇaݤX8\,]b_\S[<ՄA֥ymR0z ,$1)Ȭ(XypF倢6,Z_lBD{Lft9 zQ wPl/b( nm۬S EBtQVEhVfO%R4^FqM+E,oMSa#E7" 0 DqZǍ?*'V69ccτJ~:A- ''>p>mgU\)^6Imd^R!(:6Q(b :iퟩVjN.8$ E ,ohP+h*=bvPdxXQ%4`Ow*$SBEHB_d$ElAl :a`JS%EwBH 7׿ŇMUB(̶z(!qU! GR. 9sn%$6µdUEsti2e1:۔]KRc~9&T.8>}Q>G .E`)i &qv:NܭlEK]dfy>kp;OSn 2}ڇB葁E5 w^d5si C` ]>@uC"u^,ՏrXqXSS11z^\=X;al i4 Lt}u[VY5VQ3bo4|oL>{#: H|kKPLqdXeh~f=C?DKf{ʣcxA6SǭEéy*h & *q)G-+(BnG_=GYCFCȠ;Uh2["592/;b]?yPU"$}ZhK<;Sxb{,⾳F5]zs#*yigreu1I'2?aD ֠ef_3tn-LI[WVPx3ߑH2.zI,0Du֧J\p91KH`nV3aXXL`̗+HOO-0*&4cJѐ|Ʒjnsd h{u@XecNcNMnvz!~0\"T?BZ:&ur؅IYhzml 7CK!OwccT֎Aى5a_W),x[ӆ:JGy=EVV͂!<A4NٗYi&ĠiV ^';lTZFZg? U%!5L$)aXtVӟ:`+ߠ. tmݗ|PSpFi9ːyȤQLjYVkBj]F1+%WG^WƏ}տCaBE W,_KW#0SlµVPB7&eX dxjpŜ'p{2 ctѩI+`Mc'Y[!3~SSonT!<`~F)^=zOIm. P1#\j,a 4+9ӈr6Omh;v̍mm:hLء+X=CڰmH1ڱ#e2!ȎT ڂК+Z_0\OD*fOl *tfId \%uӣ͌e8{ҥ/ Ԇg^z&sĈ-X&:p₂Sk<Z^ ЉѱμI\s1N[yr %͕PLOnOG0ﰶ( ӢJ: .$gl9q2}zbTt)aG1~VDlvE0`vЪZBrrGa1xHQ.!*Ek&)uGڏOʃP)I!5[`#CGM`NBAT?CbШ-o5 Yʯ'ɱs]_h¡F@a)GWdzP2sa2YKȲf0eyIYkM4_2Ѡ.N1oП.y *T&ǗAw)mc\ܠ_,G5EdrbȒ*Tk\1OӥnĔ~U D6~^ QQ-DjΗ9UpË٣$@2EmI4u-BTPA]a&)OhүRu5++Vylrvjy]AS6=`I2~ <8x8z_q nv#)*O&x?ӛɴw$;͌Tc-Cu1ML^<fn2Z82l!}+oP8'tU4⊒1qQz՝$7Z7 re{O1)I=x+ Ҝk//[/WK\\[%=6e- #c%2.FJ:ۗ7VF FĞ+{=I@dVqv^ Sg( i(TvlzrLŖb8q/ey傝R Hmn] P Lp׎. /En[ɕa6/aNz&+u攁.[ dU-bPnmg=4+~vs˲KcynEk,Wwœ.MXs (O3U"a7XϺ al?7 +4ktVVyE9RpJ̤r\ErE80xiM^T6ǃy_W<)#~uAtFcKnu:-I)= vIhJZ&qơMF[V]2޽ݖB`dj:]FIV9? c%%n^%J8<)/2X5fH-#ȊK맻S0v <Ȟ^ll(:I-pg[Q ࢟DY%ƄG/ Dn\ ZZN1M,n';.EW[cn]x:.vgSr*4|rJ=\ Th#4qõWW朗|.U&P"dd -&p q+i1`|d&tTAK

`NuTe0$*Bd"@dU~c~Հ"r&fR9YV@$AhtKW0 R0P+=}|[JVZ49A\,U>iCں oJ]`MxL6PϰmmOTZiRfQf4V%AcI%7q: 8j%HjM? "0pHɗ]&?[$-wSZ1/Z~i/\Ӝ@&ww|%~%pxI_~ޕ7(zqH M(~i2"Jd҆1)_p];t4[{zg8kS߯ΊpmjtQJfN^/*)ϰnS5NÕLN$W.gpWC[xEUiPsJ xyBȡ.,ҭAi8k6ȟCg.3ҷ\;ƯcP4? { mdX $p ^t9gj2۝ӂbۙ5.ǽNcK1LQ ^zˀ{H3{M֙tn|-6#V!9+b=Qbo",Xv^N㔒( 8uD'k׫ZS1F@ntmtw6D`FHw$'SB'G.ܠsAyՒaQH7=Mɘg&irFdWrk[N?OT+Hzt r,@WV3HV"u{*Du֓V*!')`+6VJ)X7=CEg D!dI?򣿨ȩ ycտ|xPEx[*sMlL}r=<(H[ vM<-UgLq}Alfz)T4-k,bLyz)3M. m{hڶoD엙=t5~,_'YsІʪE J1ϣɕl$rDk-\@Y8B O 9 EL 3H\R=Q b_]#ÕMR9\ vcMKUPc(fzNn#N-h1 z2BAD}@0Xؽi[R5SR$TQ "dE¼хYS|fNpto'SHB˙z@>Pd3H z־Ӛi&kkUKur=Oc΀Ҡr@\41ɬטiU_T<^$@~IMhoDJH%aD/~Afj"4䭄PJAXXA)O_fe{@y o/-Vee&' o}򡳊OoSY&a QRH3ƙ1DEMyָc1@e j1c(\2ɽ-X\1pVH:4OTYu&wL$`G$+OZ?nOgse_hZ;ԦӨ)e=mg9|(Jt;5:@G;PH3שlOt+2  >63AAB`!&2gGÔe70$:l|ݼkt%qxF1AFn%W:?Z|ygs CmY2:4Y r`-kCCe Vdƃ QϧF -U#5٨`=C G=LQu:qXSS(i*\ 0ÜA:/i^FOka8(?ev#d@9-,Ӎ'KGrS߼!?PIB93/Ǔ5->kDA-,uD/wAR?.:AWkсjWk`KZC+rL~#b]7ADžӫVȅ?.œ62P`-?Yp_gb qMxnVX[їRR}w&9U|&;j$L6߷jiB4x`@DT=\(8l~VU J~o ̲ qqA^Iϛy+Sz "_[ hg 3V gQ6%]hxRD>59 q4q%8&[~ATĘr n}0ƀԿ^QbkXHnlcm<,_^۵Cxk6l!*}^WMn &%r^>-y|+KVwl5`wX<=Ne_k  5dˀ~AtcRXP/WhYa1X[K8U08ѥr}Hcc0s/CFoYuwP <8r0O*%'/BHè d}#óW谿d Ĺ4(4'w W7qPF;Tyk[ZtzJ㊥:[fFAM?r#}by5F^_By'_Te]n|/5.n}Zƪ _-$)''捎!oe@Ҟs.B95/8W0 C윆FՅ8ຬ XȀH/!ԛ/ЪwPcE= [i\Bk #'"n?}=-ټыD"UPXZSʻ, U$n7 jF1L)yЭ:htv? w=J$㭲cdh5qV/g+]|)km3yܐ(PL<9Gg0 qo|KYZ]wuۿ'0}].6Uc90=_"D3cwh W/9IWT=nƝOrd@Gޑ)(.\[m= L#Bu9,nsظO81C{s/ҳˀ }T寕C*HP~-0&J@ Ug`+4Ԍ+rj5x/tCsA*γ [k`)owg,GQ߲<ꚼ:l1fWV/wuBgx:/O quXxfԦBQONxƻśpo`i{2)}ʗ"-šLZ&閬o 1ToYn?|'t}T}R>+P5l)7M .Hy<>x&^;l(z ÎArOoS>AwJ:u!!r5[=q e%ydƛ 9.T_a^Q wBL+n^YwGSVZKaW,6/B֌q,+ Nx |d Ӝ>acKj;ݙJϢ1D0_D4Nz[[?HWB50+ؾΩZq5(L/k|I}<AYn#{#LG@ֈ, 璂i@%G:6VF`)/OSw]3^\>&3f>cca[<ʓh。pF~@~-Q8<F zdsWU5N=|ЀXczF[cp mJrB^,Xe+јlv<.LڴēHipW߽f] EpRrjٰF7m~mT^RJOg)C6J}*T#Օzt#e2c%#DİC-7e7."ڝ=Z81wwsI]IC;^ W1gumfNya/Zn}Mv)ֻИ\/P l/VaK.N`ͻP R1J4 EL*2 U$:/׵_y:}O"~R|[d%ojiSMW)mǷ=~"c.\M3S>pż "7 )oܟ]>ˁy"I [W}ZSC<FHU?4dBR2C"S468($>#ԦZcO '<8C˟KrT6~b@ɤ<}z!;o׋!DzB-Ye0|/iwׂgU H.!ڻyO-Z\ᥧX ?@PD0F4I0SXsY\Y4WTvd `dHxKʞH͍~ɟl,>1o^ mn|S==M'`;`WWݢ}T[ dXgCjWgI9|6x%~aj|4HaۿY\-],&8,G*O۔@nLf2BI!8c[uc$[~+cI~v>uѯF* 1[\9i,;6-3W߿$!|fڡ%Y.LG1q/R46v]71ÐΕ^q(uSZ0'%L*2O]f:Ƭe&(ra?JgהV.zqUV37]Pl˃iAp|r #{Gt{n3{lb|=q..Kt.zKٞ's[yob'WRѵ3.3{YbMϚE.C3/JPSb:_B+Xz P88#YbU.:[+\hMW2x6ڄGMB},72mj}Zrf4dh c]4%TaR%pڸDEʠ )fX EtZiTi熍4GMߵ \emoEн*MThb+d1zJn S(s7Lœ^։ӬD]q¥$1wǀ ߼p~Ed3c d%F&P4|F'n gzVO+LEsoPkG!a1XE1P3TUz *kᦆ G9dvbOfPV| z~^l*1Z?}ؚw@1$fe`WtK hXPފb2#欆 (4=;7 K&7Dl'= I|s>g}~! G>J22fnW, 2 2ap).1o3^A>CD;7vO7w|VG&ki`jֳ2_I(}ft?9ju+RY΍r SL2T쒷 &`SsBldMC~(8_jjqg0hkH3?8nCn!,?l,9}kP9ϐxiJz@˃L9J~KEwmmqoVcsٙqϒ/0dK A[4|A?5VPp39LKk~ki (z<$jI,' d|l(@W ¥VoީlzʥCm w\p>|gL"dITI۠MA%Qsg'A[Bg;rpkӯu3$+icF2g=+DmF"H {xp;wZO׼ͤGN sH3D ִRpTmX~8]y3R tn'Q 嗁6*l>8"ӷwr^:4(1g7X@ @R;sk_T2NG=K Nx#|oAZ:$sLB5|j:oA)&cq0dY2x׊Z|t`%dl>#+( _#c}^4XG!:G^Ԏ3oy ֟c֌{5(w>JtH:1f{oo(}ŵq:ʼn/U@]UDfn~06?FK=9qd7WyvKX||Bu=33@ݢf f8T(cT*aYX]!q@i5/xx8/l!?0XQ6@3*@G;PcdGoz{f'Vְ $1ى$𓎇Et7d4gSLE(BѲ齻v{; ovaKM nV^ m&'}ViM{f%$^2ićkA+;'2o0Ŧvsh_7lOKj6ţwBOnnfOy翃RF`h 5ׅ.jXHolɄ\O%|n3ğ0>8Az}y F Lױޝ2ٮ.ɎW=M[Aft_5ר.b  & iewʥy]-{#<1 &~erUy?]D{`_^']JRd;lES'{`N~30 +{ؿTUTXmصQ£QJ!ekU+x޶lVM[;9^$/@N!*^c'ɲafR"ϭI#r]j60 잾? *Uː?m_6o6.F5-:A4}UȅʂA¢nzPN̜_IF=vTj# V p[--A)]7ɓ2?Mm':Zi]u)jd^VL!?^J{.2se UN]$P"LU916; c VѧǍqД((6ߔ`;aO<z1B) p'h{_tt)'0᩶?od \4,v +Mt-JU?VӠ;Uo Z;vB^N 0}jU Id`j!WuI$$*b\@B6&]'5[譂nLY㞫iPFKQ>t 14nRnTR;#q ϪR 7`FTX+Q챊:?ؗ,Dkw6N-nQwG*aV!i[U|3NJd/GwSH[)hu?37#D״QnI(uͣD.e`}DB0 iɵ3olLcn'Շ\tBpOQ:%^FѧLrDԓvBܽ+Hl[e)_,㗶ƃxn~ҵ)UC5H0X<y X lغ7_^JyUă T)[R[8K!W~cmd>פ b vF`ն !~mJYߛӵ[<|v -aq%Vr gIдM-A<_21S6nTSPLuo?t 8Pjlp+Y/%,(vJ3O-!Ucrtn$`?:0 ƾ2; }0v#T,K ~/)1 Gq13 E:*8:WG(Ox=S:iwx)ZKQZolXA oȽuĀ 2͛wN\SiJ[ęmꚹ..mLRiv`P $)x8'KEjԝWFЫ0ܕDbFպ-o!88PO0b:dO׳>2A( ӶYҵo%WWg2)ͯJez8ِAE袽nӊP\ "鰍*87+$׀[ Y<_g7쥖<|XHi. vOlyo 4~>PHBQ!:FJ^ {jMYlg/ 5#M^lR7vHy(IOWd#>VT9i`W#XqW N*N6i 8>C5T91J$)7O r0=L+Y<8`쭳|z0^ʌڂQtc-G#f/.!#Z 9aGQ/-Pڎrt!6Ģ#ިbO v͝JApoaƜm$Rrᗯ~4WDC[;c|ZnjL|āUQ ?lv愥/ZȚeq[;(m}a2t0uaZ'4F!Ȥ b#`Khƛ~3)fPM̱da;߂: 6Cj֓W3 ]. QH%hjˆ2oz`T6`H=} [R<+L=Ki,"bK {i=8C™UjrH:V݋`0*R88t2X@U6-8]mN)%90);(H֚qy.E&X(5᱿ٲacmHio @#^oDl3B0YeAҥbn+z ȹg'էwN%E,)ʹ3B39/lrwN^Z~G$P䢀?͒Mq6̇|)`S,6OWg("b  ]#jAg~pJYrL$65zߣjwgsT˱F; H,7;rO{}J)EfCFjZK{-Sv i|Ui A%dkM!1AEsu X:a]ΔHsן25~yC{ldaպΌYnbyJe@2A(!su~5B͵yfUSұ TИ0o,;^pq箵iNl8;h eSSJLĢ] JѮFxX!ik!@m"6!9 d;Yfw D3W,B=$~@qP>_N U4 \>d^iXVQ( +YvlQYĊutAv~E{dnZ$ZEdp`\PsMkl'h"l뼉5!^K|8Fn}I}! C\sv,0ψvc+WTm#,S>B<͐7BОM#H̖ʻ9ꃋX~Ae< SYG5t(Щms #"`(i5(8.¢SXPt"`~+a*3۲NݵΞ",Q(Nsߟ?qZO BV 0mR:E Z͉rNTVOOO%OR`l/郐46a]xy!\X=V%Zm:{ e(qWO#S:@wJ`z-+-bc65_9#z׵9}^.óEA&acNBu-xO; %4VpN3;'@:\Q:qv;YBzv ǐ}xS_]vv2=˥mc; A|D3Az?Lf`Tq)BR䞨n@\fCFd0}J$YPOc5?<ݭu|s}S8R*:k.OVn`z@c~^d~s% miw 6J?Ճjtpܓ?qTֆ0np ?)%P%̂[U&iɑf;:'pdU25?^1(c~;-mB8a?t^H%ˉ&raH(T7kAck1b|דS=Aࣇ3yacWݞTPD9Uke5Nz/8 ৅qު/.8_-#Wq-UCT[+ jmይF,Vo$sIwuӪq_v SrE˺e%1F e Y8ЙIN1&8':Ì7e܃2B},''GYXqd! |#s%L7Xά?'vbݤ!*B[6)7flOL 7`;uӣPֳ-al9#CJ|T #4ŅHZ%:FeI?LY!Hۄgm5u8hTйA.h'q騣5[mւ82Rs?:eΚ9SIӄ^f{ywA*TLG ntYU'ky f|M~e`v[Fm{ M49.+g}{+Pwأ[A}LmTFV(ao]cZ2~ePڳw{1#H "3:88:֙( SUC3JY7w-ˈf=W󜮝67?Be|$$<*8skG̿id&YEǻ?(aίIV=IÅP_652%YkAᲖ5ԕu=Fl9IWK'&%1~ĪJ!'cv1kM50дpY8 q)!}kO Rϓ{ާ K ODt6(=Jz&úJЀ%62W-,}et#_:B`Sb+@Mml2yz Ԣ=JFTK찌1R $ٔnؽC/S|nZO߸qbi&7l[ F{ePOLr, _kn}KiZ(9q]bH/ 'Ol) 7]*\-D(ҡLybOSU:4%gk4 nȒ@"ᾫwAK۸ $8eoN|CJP+̞ T@f6fU%cg'*QynӪb` u"wh2S 1)-~-MO5ɩp7$$F<8,MBwfr7 Ft.AeJN92 (f>aBԿڊ:0ܼp@.GojsdP{Ep0a̞x !(ČA}Doih?]X0왮̌z]F&P?#k> %S Jl#lT|`Prh I`$VnaGf+M,("yҝtvW")| +r`kb,`KWM`TO7t".cCpN4%MRD$g"J#CLuc69`ՏI 5$֭邥f.P܁Rd*Zo;Z|5Ib5&lz<>u6i"I 4d{Xv VTr|v+b$cOK՘I/L6wHRlDMA|0q+fwl;A\*fXկF[E mHoʟ@U/'wUzK/UW1wQC1SwFFkLeDxܞ_v+tD&;/P1تa-?A/jc>~!gKt[CU!߀ǙR; c%1.3q`A'L瞞;D% jKEH|DyWFkdPwW؞[]cǖ\AڍmO  kz*ݑ֖7BEdu> 6wTKDP!rgHJEM~4Έ1n-}i_]#T":vXA5@ga)ts9=?V\+<fn/A{J~Қ8j#Bs@Ȭ6eV'Ŗh6a?UU*u*0]J4ShC?&E{p {͐ݯr8ìD-#ov7!;y%b6%=+{1>׋{%H*Pipli[*ߞn5ʕ7JeV5M?oW= <;Y?/l1K!)Kޟ@/Z>jJ]dY.7Ϳ7;F7gx =HysE;w>|0ggbNwkbGl>Z*qAv#^xA#Ķ%(K̎]ٕQ-Crik1?J2\†IxͅgzN7x u.s]KaaEcF}LpGz.ÀxfPw=+t3 #u w.vfǍ#8{y{"qxj@",_,Pnr*8d1TSl\\bWT$eaBZ5e!)Uq6wI79E"o L"=ڜ Z n%Z$NN72&]3T΂fXc#RrdHB d4?c 1b$TjffDžn6^"=*}D\w0Y%:$tT@\b_ndRDar:xt1Lƞ߲>B\hs/lUMJcwW$M,*eiN2hC,C0V%C0/?(MKEǴ\6c7zSif͆S OIORVU簰Ob8p0SBqƗ$/Te*ωZL/H9KQ:L}](x/jRbs i swg6U)Ӓ9n"P8v"zK>o,m|UŢMnzm+-M=VP[xg/:u}˸wH+kg  5.>Bqfm (tr5NM~*9CzЃVa2AvR(NiхhR g i[$vC[˯h2vʂ)-2{7hX PKn8y2ȦmɗBbގA^- ,\H{=đ\-M`Uվ}Ȣ>:i!`#M>xkg${E؈<*L,*̀af{5`lQڷI"A6 wAHVb!־gz+O^mmgm=Vz>eŝ"i!osB|O.a0onZ;si$*)g SЯr$C,B%GU3&rDOP}WFtݬa<8:CMict %%~BZ(d`q{i- 8p~N 3lS.Q|կ/;>vZpyI$Jl/?^6I?!.b\шeM]g0 ۹6߾۔^v:d'fi֜9SՁ˔`; *~B t\ a%׍-\/\ ֬,(QJǐ; om*!O-Z=lτ3E`HaG;+2ӤOj;2ī&y;~vuZWFkUAJZF4SEB`ŭf`ن_K^ϑFNi_O(qA;{y7_T|wշ=/x V$[m_z;2$>-oqz/!ڶJ=f=a4BnIJ2m]sjqA(S(m !Jv>_[S98^8,ԊB=<4~ɋY#Td$:]1ժc{Y76Ap.|Wȁ۩fh*ؘ'nØIvzGY/ W7\Ѿ0r}|gTHCŶWB1?rʫu9w*oc)=Y!Q6jY}eb΂m~Iq_Ho]Z:sV㔛;Tu;>g?Jb>S`CӦrg4G2H\j+¾Mߛi{e,<چuFSiM'xAen?m7ѦA+1#0iS)ŅDFqNW!g@dw,R9&/4Gv/Zk5:OB&@# ?toE;mLQ+stJݽDuB,N$cX>Eqi^(H΀]Tx@>+YRBɺPV|9I@KeNm7:s;Bt*vӐ:]_4K>-/caی^{ֳT`\8oO`Tql>7FuNjoXXA?g9vEk-{_̧};hvm~NL26qsO097?ev eB}oSaN?&qkV7.ħr٫-AMkQvAZϜeBz*?:ҼHmnAȑLò\^( BO`01 f{)EN] 3S| NY&MME(4EO.  {cfq}^=>1>)`-l`YaJ[-M)@C "]P^7Bzq^o(g?){K':rb/ʍztFe)xqʓf]'4nی G|HБy{fix3gc['t&/Q`pGdUJ\{&=[S7ygڶ4Qe1MfO{ bb  Pa("NT _M̨L/$K c}-/{}_Š Խ`f=پ:E lͼ)!PhڙO>JqZѿo-Tq>=Y_%0 YL#H5f_FBj#r8mu) @SXzk+}ѣtM1u!.Vdø<؀suTИ΀3He4EƎ$+ahTR lfyjb,1xN&w[U20.F2mfK A{&_u93pPyNl[vzizIGzmqS]4E! Mq>pIa%vHmX\Yq,4΢kfM *<CE:e'@?-4^k<8S ,pݶ(X& XFt$w}thK:tTz9WPN8EV 6C.)eiq XKDޛM}VC ɏKH_Y')Cl/aw # Ș"—Sv{4S{u,UeS|_ ߝ8g֑-UIăA!(U7 w+\y%WC' QGcowOm13߆ز7 >=[~[Nytøb@.8Ff]b3#)X`K Jc[%T(c奈4 K ,T. ˼<XOjXeKD|WB4}"0v1+ /8[ު%5`o^a|i`Mϭ0ڴbG~+̣˺emRANwwKm5S@gHVX* ˞W<^N9; }P9`?*bۥO8nOcC"U>ky 9![:Tq#:ӚzaxD"$0JQՒfT*3](cOn@Ц,X<$b5hjXUK19iMR+k@cYeֺmr&Ԫ駸n>Y]0`tt&6q4ﳸidݔEß4(]GuѴvWP/̮j =qgišxw5_*ƈs Gu,4NkoktY ?nyS$•i 7(b>2(nM]l0~Ty5?FZO eq~)1okpU o"m-%_P-0isG'WL7 d.^PPJHqZGye^Gtt}H̗"&Kp֚7Dm_KɷT`\Hu7=M UN28eP A .4qE\2>؝VxUS{ْ^3֨KP'.6uig&YRA"HBE@gqX@ 3EU,ߨߦc&.EG^oORl jt)%Ӎ'<> |{<дs'HHVPP9qdM{أsWNj1ַB k6ܥCf<"A̒sl(X/LS{5let#>4CK^ [1B%~|[ 3$)cRڪ֭ak5G;Ў$:BBpis#kkwyHQ ]5e#]H$[v$O ֎;-RP{Ѳ~u^k8C!;w(s| ˅+v2Fɭl!-!kØ9brjM~+}ai"Oͩ:*I3P_{¯Tq86.{W!U_ay%tqCyk(em"kꗋS~+>Sѡ蹟ݴ'Nv3H5vQ&934)!1tH!CyG8r;J⺰%h"g\tXߴRlنyuetJ++w):wW dX5MKӬ1ŽXM;ĤU?#b/gn/C(qզλ }&I 4@7Yg!75P9TIa^mM?C%Cf  qt os#owrE_Y&͍TX:j%Ҳn{n@څv}+N4PW{qgڡEP{|IxT̊4eP*<$'\++ӚnI?BB(G]uO2hC.`w8meSm2{>mJI(U\Fërw1\SGKN~n<"dgx_kQA4V`:7K߈b $riF5p qϡi%{\AD8<#e?>qy 01qf-0-0wCѕoϕ5?0虢}oOXq &/Z~n۾pzrixצ"!ywk(:i>A ] ]+jl~~@EuQPryvSQxC괞^A:O}"Ǔnl۸pZԻ4"Γ4;mZCHf1ȲOǕ4-[p{xTbs_Ju\I$Do'\,1G݈VDŽ)~ү"Fȥ  `.nW>&C cOnA`~XF} =N5]JPaY#avgR4=9RVKSIv⟤mc`;3=Z&zbNN\hkΦz!4|v>enHF CT%%@>hC@n н6bz%}i\B؉d\kO`dGIp4E!M1R nOQf?}ES'3@ !mBeGU .|/UgBmýaC&Xڶ|򦏺:"ͪkFV?iE] FcV<Ȣpd5 fǑ2ʟ:R%}f]l~{#OQDxQ[C(O{^ 25ËgevdkpRO}h~1q(TC[ŮMعɘZaB}jcsBbytEA>֕+tt/NzziEk G(ȏ͍$(j?㐍uEA5$Y{bݓNS?ư\;9s z,z2pxi:Z!oMQS53\6('%cڄub3O؜H?¶Eis Bu,EtUk%"(`#!n*N\lAos!UzPS| Nv^}GB8FM 5o-_sPApQ5e@$R6SS-]:Z-Bn|%=p`m+3hR mU&ByIrLz qȎtZHK/ \B&oP]-!eO?_<% by6SM-?e(.w(?U(vj1_= F vχ [ZU[fRNj *Y f%k ?PFq_˟0O pHuj TLSz 7<^_ 5٣ w 5e0Rf)XafvߦWeȖ5&9LWMRPx“ &4UclQ `Bį>'FxhwwJ<7s~򃜛Dl?93F)I?$JGnGPF[< ]>H;a2ʍWGckS rN^JWPƈ*1X9ѵ<㇀NU&6K, ޒIm6$g3jl ߸ˊ02^ K NM-!B2;CdQ_S x.(^OvOmiQ)){^^˕@]Dn]i)O2f6?yW4zNg˽\o&Fg){$8C3r-_!U@d,l-'/UocwFQ+ `#YCC$a{:L=mǽ$agV:'sr` "t遊aИTLƧ=N;)9q1_M߱7[[)o>`<:<,WP/Z