From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Content-Type: multipart/related; boundary="_92f4e339-10f5-4024-9b03-c551a309bc4f_" Subject: Re: [PATCH] hwmon: (max6650) Allow fan shutdown and a more intuitive mode interface To: Guenter Roeck , References: <1471334034-14894-1-git-send-email-mike.looijmans@topic.nl> CC: From: Mike Looijmans Message-ID: <57B6A8BF.2080508@topic.nl> Date: Fri, 19 Aug 2016 08:35:43 +0200 MIME-Version: 1.0 In-Reply-To: List-ID: --_92f4e339-10f5-4024-9b03-c551a309bc4f_ Content-Type: text/html; charset="utf-8"; format=flowed Content-Transfer-Encoding: quoted-printable

On 19-08-16 04:54, Guenter Roeck wrote:
> On 08/16/2016 12:53 AM, Mike Looijmans wrote:
>> The fan = can be stopped by writing "0" to fan1_target in sysfs.
>>
&= gt;> Writing non-zero values to fan1_target or pwm1 in sysfs automatical= ly
>> selects the corresponding control mode (closed or open loo= p).
>>
>> This allows userspace applications to contr= ol the fan speed without
>> the need to know specific details of= the controller (like the fact
>> that fan1_target does not take= effect when pwm1_enable is set to
>> anything but "2"). Early i= nitialization of the fan controller prevents
>> overheating, for= example when resetting the board while the fan was
>> completel= y turned off.
>>
>
> But this is the normal hwmo= n ABI. It should not be a surprise.
> On the other side, changing t= he mode automatically as side effect
> _is_ a surprise.

= I was under the impression that the pwm*_enable=3D2 mode was intended for <= br />temperature controlled fans. Reading the docs for a bunch of drivers r= eveals
that apart from "0=3Dfull on" and "1=3Dmanual pwm" there is no= standard whatsoever
for the meaning of this value, each driver assig= ns its own, forcing userspace
to know all the details of a particular= model. So indeed, I'll have to change
that. I'll have to wri= te software specific for this fan then, it cannot be
generic with the= current ABI.

I was actually aiming for supporting "off" mode, s= o I could later (when the
new hardware arrives) also control a relate= d power supply from this driver.

Guess I should just add a mode = "3" to implement "off".

>
>> Signed-off-by: Mike L= ooijmans <mike.looijmans@topic.nl>
>> ---
>> Th= is patch requires the devicetree support patch for the max6650.
>&g= t;
>> Changes the functionality and interface of the driver, to = be able to
>> initialize the chip at boot, and allows userspace = control without
>> requiring hardware knowledge.
>>>>  .../devicetree/bindings/hwmon/max6650.txt   &n= bsp;      |   5 +
>> &nb= sp;Documentation/hwmon/max6650        &n= bsp;            = ;   |   5 +-
>>  drivers/hwmon/max= 6650.c            &n= bsp;            = ;   | 153 +++++++++++++--------
>>  3 files = changed, 106 insertions(+), 57 deletions(-)
>>
>> dif= f --git a/Documentation/devicetree/bindings/hwmon/max6650.txt
>>= b/Documentation/devicetree/bindings/hwmon/max6650.txt
>> index = 2e46e69..724ab3a 100644
>> --- a/Documentation/devicetree/bindin= gs/hwmon/max6650.txt
>> +++ b/Documentation/devicetree/bindings/= hwmon/max6650.txt
>> @@ -13,6 +13,10 @@ Optional properties, def= ault is to retain the chip's
>> current setting:
>&g= t;  - maxim,fan-prescale  : Pre-scaling value, as per datasheet [= 1]. Lower values
>>        &n= bsp;     allow more fine-grained control of slower= fans.
>>          =     Valid: 1, 2, 4, 8, 16.
>> +- maxim,fan-t= arget-rpm: Initial requested fan rotation speed. If specified,
>>= ; the
>> +          = ;  driver selects closed-loop mode and the requested speed.
= >> +           &nbs= p;This ensures the fan is already running before userspace
>> + =            takes ove= r.
>>
>
> Needs to be separate patch and be appr= oved by devicetree maintainers. Overall,
> it would be better to ma= ke have the devicetree changces as single patch.

Okay.

How do they get synchronized then, i.e. what if the documentation gets approved but the actual implementation does not?

>> &n= bsp;Example:
>>      fan-max6650: max66= 50@1b {
>> @@ -20,4 +24,5 @@ Example:
>>   =        compatible =3D "maxim,max6650";>>          maxim,fa= n-microvolt =3D <12000000>;
>>     &nb= sp;    maxim,fan-prescale =3D <4>;
>> = +        maxim,fan-target-rpm =3D <12= 00>;
>>      };
>> diff -= -git a/Documentation/hwmon/max6650 b/Documentation/hwmon/max6650
>&= gt; index 58d9644..53e308b 100644
>> --- a/Documentation/hwmon/m= ax6650
>> +++ b/Documentation/hwmon/max6650
>> @@ -33= ,9 +33,12 @@ fan2_input    ro    "
>&= gt;  fan3_input    ro    "
>>=  fan4_input    ro    "
>> &n= bsp;fan1_target    rw    desired fan speed in= RPM (closed loop mode only)
>> +      =       Set to 0 to stop the fan. Writing any o= ther value sets
>> +        &= nbsp;   the regulator mode to "closed loop".
>> &= nbsp;pwm1_enable    rw    regulator mode, 0= =3Dfull on, 1=3Dopen loop, 2=3Dclosed loop
>>  pwm1  &= nbsp;     rw    relative speed (0-2= 55), 255=3Dmax. speed.
>> -       =      Used in open loop mode only.
>> + =            Set to 0 = to stop the fan. Writing any other value sets
>> +   &= nbsp;        the regulator mode to = "open loop".
>
> The mode should really be selected using p= wm1_enable. I don't like the idea
> of automatically changing i= t as side effect.

As above, will do.

>>  f= an1_div    rw    sets the speed range the inp= uts can handle. Legal
>>       &nb= sp;      values are 1, 2, 4, and 8. Use lower= values for
>>         &= nbsp;    faster fans.
>> diff --git a/driver= s/hwmon/max6650.c b/drivers/hwmon/max6650.c
>> index 6beb62c..d4= 0756a 100644
>> --- a/drivers/hwmon/max6650.c
>> +++ = b/drivers/hwmon/max6650.c
>> @@ -185,6 +185,35 @@ static struct = max6650_data
>> *max6650_update_device(struct device *dev)
= >>      return data;
>>  }>>
>> +static bool max6650_is_powerdown(const struct m= ax6650_data *data)
>> +{
>> +    retur= n (data->config & MAX6650_CFG_MODE_MASK) =3D=3D MAX6650_CFG_MODE_OFF= ;
>> +}
>> +
>> +/*
>> + * Chan= ge the operating mode of the chip (if needed).
>> + * mode is on= e of the MAX6650_CFG_MODE_* values.
>> + */
>> +stati= c int max6650_set_operating_mode(struct max6650_data *data, u8 mode)
&= gt;> +{
>> +    int result;
>> + &n= bsp;  u8 config =3D data->config;
>> +
>>= ; +    if (mode =3D=3D (config & MAX6650_CFG_MODE_MASK))=
>> +        return 0;
&= gt;> +
>> +    config =3D (config & ~MAX66= 50_CFG_MODE_MASK) | mode;
>> +
>> +    = ;result =3D i2c_smbus_write_byte_data(data->client, MAX6650_REG_CONFIG,<= br />>> +           = ;            co= nfig);
>> +    if (result < 0)
>> +=        return result;
>> +>> +    data->config =3D config;
>> = +
>> +    return 0;
>> +}
>>= ; +
>>  static ssize_t get_fan(struct device *dev, struct d= evice_attribute *devattr,
>>       = ;          char *buf)
>>  {
>> @@ -258,26 +287,26 @@ static ssize_t get_t= arget(struct device *dev, struct
>> device_attribute *devattr,>>       *    FanSpe= ed =3D KSCALE x fCLK / [256 x (KTACH + 1)]
>>    =    *
>>       * the= n multiply by 60 to give rpm.
>> +     *
>> +     * When not running, report target to b= e "0".
>>       */
>>>> -    kscale =3D DIV_FROM_REG(data->config);<= br />>> -    ktach =3D data->speed;
>> -=    rpm =3D 60 * kscale * clock / (256 * (ktach + 1));
= >> +    if (max6650_is_powerdown(data))
>> = +        rpm =3D 0;
>> + &nbs= p;  else {
>> +       &n= bsp;kscale =3D DIV_FROM_REG(data->config);
>> +   &= nbsp;    ktach =3D data->speed;
>> + &nbs= p;      rpm =3D 60 * kscale * clock / (256 * = (ktach + 1));
>> +    }
>>   = ;   return sprintf(buf, "%d\n", rpm);
>>  }<= br />>>
>> -static ssize_t set_target(struct device *dev, = struct device_attribute
>> *devattr,
>> -   = ;          const char *bu= f, size_t count)
>> +static int max6650_set_target(struct max665= 0_data *data, unsigned long rpm)
>>  {
>> - &nbs= p;  struct max6650_data *data =3D dev_get_drvdata(dev);
>= > -    struct i2c_client *client =3D data->client;
>>      int kscale, ktach;
>> -=    unsigned long rpm;
>> -    int= err;
>>
>> -    err =3D kstrtoul(buf,= 10, &rpm);
>> -    if (err)
>> - =        return err;
>> +  = ;  if (rpm =3D=3D 0)
>> +     &nbs= p;  return max6650_set_operating_mode(data, MAX6650_CFG_MODE_OFF)= ;
>>
>>      rpm =3D clamp_v= al(rpm, FAN_RPM_MIN, FAN_RPM_MAX);
>>
>> @@ -288,8 +3= 17,6 @@ static ssize_t set_target(struct device *dev, struct
>> = device_attribute *devattr,
>>      &nbs= p;*     KTACH =3D [(fCLK x KSCALE) / (256 x FanSpeed)] = - 1
>>       */
>>
>> -    mutex_lock(&data->update_lock);
&= gt;> -
>>      kscale =3D DIV_FROM_R= EG(data->config);
>>      ktach =3D = ((clock * kscale) / (256 * rpm / 60)) - 1;
>>    =   if (ktach < 0)
>> @@ -298,7 +325,25 @@ static ssi= ze_t set_target(struct device *dev, struct
>> device_attribute *= devattr,
>>         &nbs= p;ktach =3D 255;
>>      data->speed= =3D ktach;
>>
>> -    i2c_smbus_write= _byte_data(client, MAX6650_REG_SPEED, data->speed);
>> + &nbs= p;  i2c_smbus_write_byte_data(data->client, MAX6650_REG_SPEED,= data->speed);
>> +
>> +    return = max6650_set_operating_mode(data, MAX6650_CFG_MODE_CLOSED_LOOP);
>&g= t; +}
>> +
>> +static ssize_t set_target(struct devic= e *dev, struct device_attribute
>> *devattr,
>> + &nb= sp;           const = char *buf, size_t count)
>> +{
>> +    = ;struct max6650_data *data =3D dev_get_drvdata(dev);
>> +  =   unsigned long rpm;
>> +    int err;>> +
>> +    err =3D kstrtoul(buf, 10, = &rpm);
>> +    if (err)
>> +  = ;      return err;
>> +
>&= gt; +    mutex_lock(&data->update_lock);
>>= ; +
>> +    err =3D max6650_set_target(data, rpm)= ;
>>
>>      mutex_unlock(&a= mp;data->update_lock);
>>
>> @@ -320,17 +365,21 @@= static ssize_t get_pwm(struct device *dev, struct
>> device_att= ribute *devattr,
>>      int pwm;
= >>      struct max6650_data *data =3D max665= 0_update_device(dev);
>>
>> -    /*>> -     * Useful range for dac is 0-180 for 1= 2V fans and 0-76 for 5V fans.
>> -     * Low= er DAC values mean higher speeds.
>> -     *= /
>> -    if (data->config & MAX6650_CFG_V= 12)
>> -        pwm =3D 255 -= (255 * (int)data->dac)/180;
>> -    else
>> -        pwm =3D 255 - (255 * = (int)data->dac)/76;
>> -
>> -    if= (pwm < 0)
>> +    if (max6650_is_powerdown(da= ta))
>>          pw= m =3D 0;
>> +    else {
>> +  &nb= sp;     /*
>> +     = ;    * Useful range for dac is 0-180 for 12V fans and 0= -76 for 5V
>> +         = * fans. Lower DAC values mean higher speeds.
>> +   &n= bsp;     */
>> +    &nbs= p;   if (data->config & MAX6650_CFG_V12)
>>= ; +            pwm = =3D 255 - (255 * (int)data->dac)/180;
>> +    =     else
>> +      =       pwm =3D 255 - (255 * (int)data->dac)= /76;
>> +
>> +       &n= bsp;if (pwm < 0)
>> +       &nb= sp;    pwm =3D 0;
>> +    }>>
>>      return sprintf(buf= , "%d\n", pwm);
>>  }
>> @@ -351,16 +400,20 @@ s= tatic ssize_t set_pwm(struct device *dev, struct
>> device_attri= bute *devattr,
>>
>>      mu= tex_lock(&data->update_lock);
>>
>> -  &n= bsp; if (data->config & MAX6650_CFG_V12)
>> -  =       data->dac =3D 180 - (180 * pwm)/255;=
>> -    else
>> -    &= nbsp;   data->dac =3D 76 - (76 * pwm)/255;
>> = -
>> -    i2c_smbus_write_byte_data(client, MAX66= 50_REG_DAC, data->dac);
>> +    if (pwm =3D=3D= 0)
>> +        err =3D max66= 50_set_operating_mode(data, MAX6650_CFG_MODE_OFF);
>> +  &n= bsp; else {
>> +        = if (data->config & MAX6650_CFG_V12)
>> +   &nbs= p;        data->dac =3D 180 - (1= 80 * pwm)/255;
>> +        el= se
>> +          &n= bsp; data->dac =3D 76 - (76 * pwm)/255;
>> +   = ;     i2c_smbus_write_byte_data(client, MAX6650_RE= G_DAC, data->dac);
>> +       &= nbsp;err =3D max6650_set_operating_mode(data, MAX6650_CFG_MODE_OPEN_LOOP);<= br />>> +    }
>>
>>   = ;   mutex_unlock(&data->update_lock);
>>>> -    return count;
>> +   =  return err < 0 ? err : count;
>>  }
>><= br />>>  /*
>> @@ -385,25 +438,24 @@ static ssize_t s= et_enable(struct device *dev, struct
>> device_attribute *devatt= r,
>>          &nbs= p;     const char *buf, size_t count)
>>= ;  {
>>      struct max6650_data *= data =3D dev_get_drvdata(dev);
>> -    struct i2c= _client *client =3D data->client;
>> -    int = max6650_modes[3] =3D {0, 3, 2};
>>      = ;unsigned long mode;
>>      int err;>> +    const u8 max6650_modes[3] =3D {
>&= gt; +        MAX6650_CFG_MODE_ON,
&= gt;> +        MAX6650_CFG_MODE_OPEN_L= OOP,
>> +        MAX6650_CFG_= MODE_CLOSED_LOOP
>> +        = };
>>
>>      err =3D kstrto= ul(buf, 10, &mode);
>>      if (err= )
>>          retur= n err;
>>
>> -    if (mode > 2)
>> +    if (mode >=3D ARRAY_SIZE(max6650_modes))<= br />>>          return = -EINVAL;
>>
>>      mutex_lo= ck(&data->update_lock);
>>
>> -   &n= bsp;data->config =3D i2c_smbus_read_byte_data(client, MAX6650_REG_CONFIG= );
>> -    data->config =3D (data->config &= amp; ~MAX6650_CFG_MODE_MASK)
>> -      =          | (max6650_modes[mode= ] << 4);
>> -
>> -    i2c_smbus_= write_byte_data(client, MAX6650_REG_CONFIG, data->config);
>>= +    max6650_set_operating_mode(data, max6650_modes[mode]);=
>>
>>      mutex_unlock(&am= p;data->update_lock);
>>
>> @@ -582,6 +634,7 @@ st= atic int max6650_init_client(struct max6650_data *data,
>>  = ;    int err =3D -EIO;
>>    =   u32 voltage;
>>      u32 pr= escale;
>> +    u32 target_rpm;
>>
>>      if (of_property_read_u32(dev->o= f_node, "maxim,fan-microvolt",
>>      =             &nb= sp;&voltage))
>> @@ -642,22 +695,6 @@ static int max6650_ini= t_client(struct max6650_data *data,
>>     &= nbsp;     (config & MAX6650_CFG_V12) ? 12 : 5,=
>>           = 1 << (config & MAX6650_CFG_PRESCALER_MASK));
>>
&= gt;> -    /*
>> -     * If= mode is set to "full off", we change it to "open loop" and
>> -=     * set DAC to 255, which has the same effect. We do= this because
>> -     * there's no "ful= l off" mode defined in hwmon specifications.
>> -   &n= bsp; */
>> -
>> -    if ((config = & MAX6650_CFG_MODE_MASK) =3D=3D MAX6650_CFG_MODE_OFF) {
>> -=        dev_dbg(dev, "Change mode to ope= n loop, full off.\n");
>> -       =  config =3D (config & ~MAX6650_CFG_MODE_MASK)
>> - &nbs= p;           | MAX66= 50_CFG_MODE_OPEN_LOOP;
>> -       =  if (i2c_smbus_write_byte_data(client, MAX6650_REG_DAC, 255)) {
&= gt;> -            = ;dev_err(dev, "DAC write error, aborting.\n");
>> -   =          return err;
>= > -        }
>> -  &n= bsp; }
>> -
>>      if = (i2c_smbus_write_byte_data(client, MAX6650_REG_CONFIG, config)) {
>= >          dev_err(dev, "Co= nfig write error, aborting.\n");
>>     &nbs= p;    return err;
>> @@ -666,6 +703,10 @@ st= atic int max6650_init_client(struct max6650_data *data,
>>  = ;    data->config =3D config;
>>  &n= bsp;   data->count =3D i2c_smbus_read_byte_data(client, M= AX6650_REG_COUNT);
>>
>> +    if (!of_= property_read_u32(client->dev.of_node, "maxim,fan-target-rpm",
>= > +            &n= bsp;    &target_rpm))
>> +   &= nbsp;    max6650_set_target(data, target_rpm);
>= ;> +
>>      return 0;
>>=  }
>>
>>
>

 

Kind regards,

 

Mike Looijmans

System Expert

 



= <= IMG id=3DIMG1 border=3D0 src=3D"cid:imagefeceb9.JPG@19be1578.4d8014a7" widt= h=3D20 height=3D18 />
Please consider the environment before printing this e-mail


Topic zoekt gedreven (embedded) software specialisten!

--_92f4e339-10f5-4024-9b03-c551a309bc4f_ Content-Type: image/png Content-Transfer-Encoding: base64 Content-ID: Content-Disposition: inline; filename="imagec89c5e.PNG" Content-Location: imagec89c5e.PNG Content-Description: imagec89c5e.PNG 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 AAAAAElFTkSuQmCC --_92f4e339-10f5-4024-9b03-c551a309bc4f_ Content-Type: image/jpeg Content-Transfer-Encoding: base64 Content-ID: Content-Disposition: inline; filename="image2e1418.JPG" Content-Location: image2e1418.JPG Content-Description: image2e1418.JPG /9j/4AAQSkZJRgABAQEAYABgAAD/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAEAAAAAAAD/ 2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwM BwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAATABQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEA AAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJx FDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNk ZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJ ytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQF BgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMz UvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3 eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna 4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD3/wDaq/bN1S5/aP8AGFj/AMJY8Z0nU57M Qrd+X5KpIyhdpPAAGMDjv1zXt/gj4T6zov7Jd98RvG2ofE5dTkMxsdK0yAlrWNVYx3FwrKT5J272 fIAQjrmvzj/bY8Ppc/tk/EzzFGJfEN6QGH3lMzj8ehH4V9i/Ez46+No/+CHnhbVf+E014a7qHiaX Sru8F8ftFxYl7uM27t1MWxVXaeMAV+347K6scFglheWPtJQi3bXWN+z0dnf/AIc+Bw+IpyrVnVbf Km9/P1+4++f2Bvi7c/GL9k/wn4gur7+1JryGVTdB9/mhJXUfMeWwBjPfHeiuH/4JFaa1j/wT88BQ 7DH5cdyu0jG3FzLxRX5NmtGEMbWhHZSkvxZ9Jh61b2UfRfkjqvjB+wh8JPiN46ute1jwTp13q2pf vrmcTTRec/QsVRwu44GSBknk5Nc4f+CdXwYnKxt4HtTGrAhft13tBz6ebRRU0c1xsIKEK00ktlJ2 /M7pYWi5XcF9yPofwZ4E0f4eeFbHQ9E0+303SdNiENtbQAqkS9fxJJJJOSSSTkmiiivN5pN3b1Ov lS0R/9k= --_92f4e339-10f5-4024-9b03-c551a309bc4f_ Content-Type: image/jpeg Content-Transfer-Encoding: base64 Content-ID: Content-Disposition: inline; filename="imageecab5a.JPG" Content-Location: imageecab5a.JPG Content-Description: imageecab5a.JPG /9j/4AAQSkZJRgABAQEAYABgAAD/4QAiRXhpZgAATU0AKgAAAAgAAQESAAMAAAABAAEAAAAAAAD/ 2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcGBwcICQsJCAgKCAcHCg0KCgsMDAwM BwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAATABQDASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEA AAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJx FDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNk ZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJ ytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQF BgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMz UvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3 eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna 4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD9RPhzfN8bfjF46bVPEmrrZ+H51hW3sbvy W3O7gZODgKFOAB+lc38Wfh747+Gen6tq8PiJr7QdOcyCdNRBnWDcAskicYxkBsZxWP8ACLWI9B+L /wAUtNjmhh1TXLyGeyWaVYhdeTLJvjVmwNxD5AJGdpA5ruf2kPEM/iL4EeJLO60mHwer2qlZorqJ zqbCRf8ARSvLYfknb02c8Zr9U5KtLFwhTtyS5FZpaJqOqV03q3qk/PY/m363TxOXVKlVy9pH2sua LlrJSnZSdnFKyi7ScdGmt9fb/wBlr4gXPj34HaLqd1cfbJpldTMDneFcqMk/SisH9hzT2tf2ZvDs e0rsEoIPGP3rUV8BmVKEcZVjHZSl+Z+0ZDisRUyzDVJat04N+riit8TvgL4R1PxlNfTaLC1zep58 zLLIod2Jy20MAM9TgdeetYc3wA8ITwAto6ZUjBFxKMf+PUUVzRzLFxSjGrKy/vP/ADPUqcP5XUk5 1MNTbd224Rbb+4978KeFtP8ACvh200/T7ZLWztYwkUSE4UdT1OSSSSSeSTRRRXJzN6tnqRhGK5Yq yR//2Q== --_92f4e339-10f5-4024-9b03-c551a309bc4f_ Content-Type: image/jpeg Content-Transfer-Encoding: base64 Content-ID: Content-Disposition: inline; filename="imagefeceb9.JPG" Content-Location: imagefeceb9.JPG Content-Description: imagefeceb9.JPG /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAIBAQIBAQICAgICAgICAwUDAwMDAwYEBAMFBwYHBwcG BwcICQsJCAgKCAcHCg0KCgsMDAwMBwkODw0MDgsMDAz/2wBDAQICAgMDAwYDAwYMCAcIDAwMDAwM DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/wAARCAASABQDASIA AhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQA AAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3 ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWm p6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEA AwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSEx BhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElK U1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3 uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD6i+EP xt0H48fBf4l+L0/4SmfVvDeqxWiTCNVtYbmebaFuC5yxd3AyD/EMZJOdfx18N/ip8MvAOt+J9c8J ajp2i+HImuNRm82OWSCEAlpRCrF3jA3ZYAj5T1wc/L3wE/ah8N/sy/Aj41/DTxTYa9b+KPFHimxu lhjgiC2LWN7G80UwkdWST90wA2nnGSOo9H1X/gqB4C1P9r746ePini4+H/ib4HXwvpFo/kmW2uRb pHvlj8/ZHHuDncpY/MeOTj9brZLio1Z+wp3huut1aG1u95a67bH4jR4lwTowWIqpTtZq9rO9TVpp 3taCtp8R+g//AASd+NVr8eP2RbbWbGW6ms4dXvbOIzoU4SQE7QSTtyxIz60Vwv8AwQP8O3Xh3/gn do4uLeSCK71i/uLZ2XC3MRkCiRDgZQsrAHviivzjO6UaWYVqcNlJr8T9W4frzr5ZQrVN5Qi/vR9Z 658MPDXifUWvNS8PaHqF2wCtPc2EUshA6Asyk8YH5VTHwP8ABY/5lDwv/wCCqD2/2fYfkKKK68P/ AAYlT+J+rOnhhS3hWONVREAVVUYCgdABRRRXgvc9VbH/2Q== --_92f4e339-10f5-4024-9b03-c551a309bc4f_--

TOPIC Products

 

 

Mate= riaalweg 4

 

 

5681 RJ Best

T:

+31 = (0) 499 33 69 69

Post= bus 440

E:

mike.looijmans@topicproducts.com

5680= AK Best

W:

www.topicproducts.com

The Netherlands