Messages in this thread | | | Date | Mon, 12 Jan 2015 14:46:59 +0100 | From | Jacek Anaszewski <> | Subject | Re: [PATCH/RFC v10 08/19] leds: Add support for max77693 mfd flash cell |
| |
On 01/12/2015 02:25 PM, Pavel Machek wrote: > Hi! > >>>> +struct max77693_sub_led { >>>> + /* related FLED output identifier */ >>> >>> ->flash LED, about 4x. >>> >>>> +/* split composite current @i into two @iout according to @imax weights */ >>>> +static void __max77693_calc_iout(u32 iout[2], u32 i, u32 imax[2]) >>>> +{ >>>> + u64 t = i; >>>> + >>>> + t *= imax[1]; >>>> + do_div(t, imax[0] + imax[1]); >>>> + >>>> + iout[1] = (u32)t / FLASH_IOUT_STEP * FLASH_IOUT_STEP; >>>> + iout[0] = i - iout[1]; >>>> +} >>> >>> Is 64-bit arithmetics neccessary here? Could we do the FLASH_IOUT_STEP >>> divisons before t *=, so that 64-bit division is not neccessary? >> >> It is required. All these operations allow for splitting the composite >> current into both outputs according to weights given in the imax >> array. > > I know. > > What about this? > > static void __max77693_calc_iout(u32 iout[2], u32 i, u32 imax[2]) > { > u32 t = i; > > t *= imax[1] / FLASH_IOUT_STEP;
Let's consider following case:
t = 1000000 imax[1] = 1000000
multiplication of the above will give 10^12 - much more than it is possible to encode on 32 bits.
> t = t / (imax[0] + imax[1]); > t /= FLASH_IOUT_STEP > > iout[1] = (u32)t; > iout[0] = i - iout[1]; > } > > Does it lack precision? > > Thanks, > Pavel >
-- Best Regards, Jacek Anaszewski
| |