[alsa-devel] [PATCH v2] ASoC: sun4i-i2s: Change SR and WSS computation
Rojewski, Cezary
cezary.rojewski at intel.com
Thu Jun 6 13:49:58 CEST 2019
>Hi,
>
>On Wed, Jun 05, 2019 at 04:36:28PM +0000, Rojewski, Cezary wrote:
>> >+static s8 sun4i_i2s_get_sr(const struct sun4i_i2s *i2s, int width)
>> >+{
>> >+ if (width < 16 || width > 24)
>> >+ return -EINVAL;
>> >+
>> >+ if (width % 4)
>> >+ return -EINVAL;
>> >+
>> >+ return (width - 16) / 4;
>> >+}
>> >+
>> >+static s8 sun4i_i2s_get_wss(const struct sun4i_i2s *i2s, int width)
>> >+{
>> >+ if (width < 16 || width > 32)
>> >+ return -EINVAL;
>> >+
>> >+ if (width % 4)
>> >+ return -EINVAL;
>> >+
>> >+ return (width - 16) / 4;
>> >+}
>> >+
>> >+static s8 sun8i_i2s_get_sr_wss(const struct sun4i_i2s *i2s, int width)
>> >+{
>> >+ if (width % 4)
>> >+ return -EINVAL;
>> >+
>>
>> In the two above you start with boundary check before mod yet in
>> this one the order is reversed. Keeping the same order should prove
>> more cohesive.
>
>Indeed, I'll fix this.
>
>>
>> >+ if (width < 8 || width > 32)
>> >+ return -EINVAL;
>> >+
>> >+ return (width - 8) / 4 + 1;
>> >+}
>> >+
>>
>> Other, probably less welcome suggestion is introduction of unified
>> function which ones listed here would simply invoke. All of these
>> "computations" differ in fact only in: min and max boundary. The +1
>> for _sr_wss is negligible, you can append it on return.
>
>It's not just about the min and max boundaries. It's also the offset
>at which to start with (16 vs 8), and the offset to apply to the
>result (0 vs 1).
>
>That's 4 parameters out of 5 that are different. For something that
>trivial, I don't think it's worth it to put it in common.
>
>Maxime
This is what was going through my mind:
static inline s8 my_unified(int width, u8 min, u8 max)
{
if (width < min || width > max)
return -EINVAL;
if (width % 4)
return -EINVAL;
return (width - min) / 4;
}
static s8 sun4i_i2s_get_sr(const struct sun4i_i2s *i2s, int width)
{
return my_unified(width, 16, 24);
}
static s8 sun4i_i2s_get_wss(const struct sun4i_i2s *i2s, int width)
{
return my_unified(width, 16, 32);
}
static s8 sun8i_i2s_get_sr_wss(const struct sun4i_i2s *i2s, int width)
{
return my_unified(width, 8, 32) + 1;
}
However, if indeed 'start' offset is variable and may differ from min boundary, then my approach would fail.
Otherwise, treat it as suggestion, personally I find it easier to update only the unified function (development phase), especially if you're planning for adding more of these (the min/ max variants) in the future.
One more thing, the i2s ptr is unused - consider flagging it or simply removing from declaration?
Czarek
More information about the Alsa-devel
mailing list