From mboxrd@z Thu Jan 1 00:00:00 1970 From: Andy Shevchenko Subject: Re: [PATCH v2 2/9] i2c: add generic routine to parse DT for timing information Date: Tue, 08 Dec 2015 12:54:45 +0200 Message-ID: <1449572085.30729.28.camel@linux.intel.com> References: <1449567473-2084-1-git-send-email-wsa@the-dreams.de> <1449567473-2084-3-git-send-email-wsa@the-dreams.de> Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: QUOTED-PRINTABLE Return-path: In-Reply-To: <1449567473-2084-3-git-send-email-wsa@the-dreams.de> Sender: linux-sh-owner@vger.kernel.org To: Wolfram Sang , linux-i2c@vger.kernel.org Cc: linux-sh@vger.kernel.org, Magnus Damm , Simon Horman , Laurent Pinchart , Geert Uytterhoeven , Yoshihiro Shimoda , linux-rockchip@lists.infradead.org, Mika Westerberg , Jarkko Nikula List-Id: linux-i2c@vger.kernel.org On Tue, 2015-12-08 at 10:37 +0100, Wolfram Sang wrote: > From: Wolfram Sang >=20 > Inspired from the i2c-rk3x driver (thanks guys!) but refactored and > extended. See built-in docs for further information. One style comment. >=20 > Signed-off-by: Wolfram Sang > --- > =C2=A0drivers/i2c/i2c-core.c | 47 > +++++++++++++++++++++++++++++++++++++++++++++++ > =C2=A0include/linux/i2c.h=C2=A0=C2=A0=C2=A0=C2=A0| 18 +++++++++++++++= +++ > =C2=A02 files changed, 65 insertions(+) >=20 > diff --git a/drivers/i2c/i2c-core.c b/drivers/i2c/i2c-core.c > index ba8eb087f22465..e94d2ca2aab4aa 100644 > --- a/drivers/i2c/i2c-core.c > +++ b/drivers/i2c/i2c-core.c > @@ -53,6 +53,7 @@ > =C2=A0#include > =C2=A0#include > =C2=A0#include > +#include > =C2=A0 > =C2=A0#include "i2c-core.h" > =C2=A0 > @@ -1438,6 +1439,52 @@ static void of_i2c_register_devices(struct > i2c_adapter *adap) > =C2=A0 } > =C2=A0} > =C2=A0 > +/** > + * i2c_parse_fw_timings - get I2C related timing parameters from > firmware > + * @dev: The device to scan for I2C timing properties > + * @t: the i2c_timings struct to be filled with values > + * @use_defaults: bool to use sane defaults derived from the I2C > specification > + *=C2=A0 =C2=A0=C2=A0when properties are not found, otherwise use 0 > + * > + * Scan the device for the generic I2C properties describing timing > parameters > + * for the signal and fill the given struct with the results. If a > property was > + * not found and use_defaults was true, then maximum timings are > assumed which > + * are derived from the I2C specification. If use_defaults is not > used, the > + * results will be 0, so drivers can apply their own defaults later. > The latter > + * is mainly intended for avoiding regressions of existing drivers > which want > + * to switch to this function. New drivers almost always should use > the defaults. > + */ > + > +void i2c_parse_fw_timings(struct device *dev, struct i2c_timings *t, > bool use_defaults) > +{ > + memset(t, 0, sizeof(*t)); > + > + if (device_property_read_u32(dev, "clock-frequency", &t- > >bus_freq_hz) && use_defaults) > + t->bus_freq_hz =3D 100000; > + > + if (device_property_read_u32(dev, "i2c-scl-rising-time-ns", > &t->scl_rise_ns) && use_defaults) { > + if (t->bus_freq_hz <=3D 100000) > + t->scl_rise_ns =3D 1000; > + else if (t->bus_freq_hz <=3D 400000) > + t->scl_rise_ns =3D 300; > + else > + t->scl_rise_ns =3D 120; > + } > + > + if (device_property_read_u32(dev, "i2c-scl-falling-time-ns",=20 > &t->scl_fall_ns) && use_defaults) { > + if (t->bus_freq_hz <=3D 400000) > + t->scl_fall_ns =3D 300; > + else > + t->scl_fall_ns =3D 120; > + } > + > + device_property_read_u32(dev, "i2c-scl-internal-delay-ns", > &t->scl_int_delay_ns); > + > + if (device_property_read_u32(dev, "i2c-sda-falling-time-ns",=20 > &t->sda_fall_ns) && use_defaults) > + t->sda_fall_ns =3D t->scl_fall_ns; Too many && use_defaults. What about memset(t, 0, sizeof(*t)); device_property_read_u32(dev, "i2c-scl-internal-delay-ns", &t- >scl_int_delay_ns); if (!use_defaults) =C2=A0return; =2E.. --=20 Andy Shevchenko Intel Finland Oy