>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