Message ID | 1377866264-21110-5-git-send-email-ulrich.hecht@gmail.com (mailing list archive) |
---|---|
State | RFC |
Headers | show |
Hello. On 08/30/2013 04:37 PM, Ulrich Hecht wrote: > From: Nguyen Viet Dung <nv-dung@jinso.co.jp> > This patch modify calculate for clock in I2C driver. Maybe "modifies clock calculation" instead? > Signed-off-by: Nguyen Viet Dung <nv-dung@jinso.co.jp> > --- > drivers/i2c/busses/i2c-rcar.c | 17 +++++++++++++++-- > include/linux/i2c/i2c-rcar.h | 4 ++++ > 2 files changed, 19 insertions(+), 2 deletions(-) > diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c > index 0fc5858..c4fb69c 100644 > --- a/drivers/i2c/busses/i2c-rcar.c > +++ b/drivers/i2c/busses/i2c-rcar.c [...] > @@ -287,7 +300,7 @@ scgd_find: > /* > * keep icccr value > */ > - priv->icccr = (scgd << 2 | cdf); > + priv->icccr = (scgd << (cdf_width) | cdf); Parens not needed here at all (if only around <<). WBR, Sergei -- To unsubscribe from this list: send the line "unsubscribe linux-sh" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
Hello, Thank you for the patch. On Friday 30 August 2013 14:37:38 Ulrich Hecht wrote: > From: Nguyen Viet Dung <nv-dung@jinso.co.jp> > > This patch modify calculate for clock in I2C driver. > > Signed-off-by: Nguyen Viet Dung <nv-dung@jinso.co.jp> > --- > drivers/i2c/busses/i2c-rcar.c | 17 +++++++++++++++-- > include/linux/i2c/i2c-rcar.h | 4 ++++ > 2 files changed, 19 insertions(+), 2 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c > index 0fc5858..c4fb69c 100644 > --- a/drivers/i2c/busses/i2c-rcar.c > +++ b/drivers/i2c/busses/i2c-rcar.c > @@ -221,15 +221,28 @@ static int rcar_i2c_clock_calculate(struct > rcar_i2c_priv *priv, struct device *dev) > { > struct clk *clkp = clk_get(NULL, "peripheral_clk"); > + struct i2c_rcar_platform_data *pdata = dev->platform_data; > u32 scgd, cdf; > u32 round, ick; > u32 scl; > + u32 cdf_width; > + u32 flags = pdata ? pdata->flags : 0; > > if (!clkp) { > dev_err(dev, "there is no peripheral_clk\n"); > return -EIO; > } > > + switch (flags & I2C_RCAR_FLAGS_ICCCR_MASK) { > + default: > + case I2C_RCAR_FLAGS_ICCCR_IS_2BIT: > + cdf_width = 2; > + break; > + case I2C_RCAR_FLAGS_ICCCR_IS_3BIT: > + cdf_width = 3; > + break; > + } > + > /* > * calculate SCL clock > * see > @@ -245,7 +258,7 @@ static int rcar_i2c_clock_calculate(struct rcar_i2c_priv > *priv, * clkp : peripheral_clk > * F[] : integer up-valuation > */ > - for (cdf = 0; cdf < 4; cdf++) { > + for (cdf = 0; cdf < (1 << cdf_width); cdf++) { > ick = clk_get_rate(clkp) / (1 + cdf); > if (ick < 20000000) > goto ick_find; > @@ -287,7 +300,7 @@ scgd_find: > /* > * keep icccr value > */ > - priv->icccr = (scgd << 2 | cdf); > + priv->icccr = (scgd << (cdf_width) | cdf); > > return 0; > } > diff --git a/include/linux/i2c/i2c-rcar.h b/include/linux/i2c/i2c-rcar.h > index 496f5c2..572a6e5 100644 > --- a/include/linux/i2c/i2c-rcar.h > +++ b/include/linux/i2c/i2c-rcar.h > @@ -5,6 +5,10 @@ > > struct i2c_rcar_platform_data { > u32 bus_speed; > + u32 flags; > +#define I2C_RCAR_FLAGS_ICCCR_MASK (0xF << 0) > +#define I2C_RCAR_FLAGS_ICCCR_IS_2BIT (0 << 0) /* default */ > +#define I2C_RCAR_FLAGS_ICCCR_IS_3BIT (1 << 0) That looks like an IP core property to me, not a platform property. Shouldn't it be added to a platform_device_id table in the driver instead of being passed through platform data ? > }; > > #endif /* __I2C_R_CAR_H__ */
On Mon, Sep 2, 2013 at 3:22 PM, Laurent Pinchart <laurent.pinchart@ideasonboard.com> wrote: > On Friday 30 August 2013 14:37:38 Ulrich Hecht wrote: >> --- a/include/linux/i2c/i2c-rcar.h >> +++ b/include/linux/i2c/i2c-rcar.h >> @@ -5,6 +5,10 @@ >> >> struct i2c_rcar_platform_data { >> u32 bus_speed; >> + u32 flags; >> +#define I2C_RCAR_FLAGS_ICCCR_MASK (0xF << 0) >> +#define I2C_RCAR_FLAGS_ICCCR_IS_2BIT (0 << 0) /* default */ >> +#define I2C_RCAR_FLAGS_ICCCR_IS_3BIT (1 << 0) > > That looks like an IP core property to me, not a platform property. Shouldn't > it be added to a platform_device_id table in the driver instead of being > passed through platform data ? Dung has already posted a new version of this patch that solves this differently, but I haven't had time to integrate it yet: http://www.spinics.net/lists/kernel/msg1595839.html CU Uli -- To unsubscribe from this list: send the line "unsubscribe linux-sh" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
On Fri, Aug 30, 2013 at 02:37:38PM +0200, Ulrich Hecht wrote: > From: Nguyen Viet Dung <nv-dung@jinso.co.jp> > > This patch modify calculate for clock in I2C driver. Hi, could we have a slightly clearer subject for this patch. > > Signed-off-by: Nguyen Viet Dung <nv-dung@jinso.co.jp> > --- > drivers/i2c/busses/i2c-rcar.c | 17 +++++++++++++++-- > include/linux/i2c/i2c-rcar.h | 4 ++++ > 2 files changed, 19 insertions(+), 2 deletions(-) > > diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c > index 0fc5858..c4fb69c 100644 > --- a/drivers/i2c/busses/i2c-rcar.c > +++ b/drivers/i2c/busses/i2c-rcar.c > @@ -221,15 +221,28 @@ static int rcar_i2c_clock_calculate(struct rcar_i2c_priv *priv, > struct device *dev) > { > struct clk *clkp = clk_get(NULL, "peripheral_clk"); > + struct i2c_rcar_platform_data *pdata = dev->platform_data; > u32 scgd, cdf; > u32 round, ick; > u32 scl; > + u32 cdf_width; > + u32 flags = pdata ? pdata->flags : 0; > > if (!clkp) { > dev_err(dev, "there is no peripheral_clk\n"); > return -EIO; > } > > + switch (flags & I2C_RCAR_FLAGS_ICCCR_MASK) { > + default: > + case I2C_RCAR_FLAGS_ICCCR_IS_2BIT: > + cdf_width = 2; > + break; > + case I2C_RCAR_FLAGS_ICCCR_IS_3BIT: > + cdf_width = 3; > + break; > + } > + > /* > * calculate SCL clock > * see > @@ -245,7 +258,7 @@ static int rcar_i2c_clock_calculate(struct rcar_i2c_priv *priv, > * clkp : peripheral_clk > * F[] : integer up-valuation > */ > - for (cdf = 0; cdf < 4; cdf++) { > + for (cdf = 0; cdf < (1 << cdf_width); cdf++) { > ick = clk_get_rate(clkp) / (1 + cdf); > if (ick < 20000000) > goto ick_find; > @@ -287,7 +300,7 @@ scgd_find: > /* > * keep icccr value > */ > - priv->icccr = (scgd << 2 | cdf); > + priv->icccr = (scgd << (cdf_width) | cdf); > > return 0; > } > diff --git a/include/linux/i2c/i2c-rcar.h b/include/linux/i2c/i2c-rcar.h > index 496f5c2..572a6e5 100644 > --- a/include/linux/i2c/i2c-rcar.h > +++ b/include/linux/i2c/i2c-rcar.h > @@ -5,6 +5,10 @@ > > struct i2c_rcar_platform_data { > u32 bus_speed; > + u32 flags; > +#define I2C_RCAR_FLAGS_ICCCR_MASK (0xF << 0) > +#define I2C_RCAR_FLAGS_ICCCR_IS_2BIT (0 << 0) /* default */ > +#define I2C_RCAR_FLAGS_ICCCR_IS_3BIT (1 << 0) > }; > > #endif /* __I2C_R_CAR_H__ */ > -- > 1.8.1.4 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-sh" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html > -- To unsubscribe from this list: send the line "unsubscribe linux-sh" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/drivers/i2c/busses/i2c-rcar.c b/drivers/i2c/busses/i2c-rcar.c index 0fc5858..c4fb69c 100644 --- a/drivers/i2c/busses/i2c-rcar.c +++ b/drivers/i2c/busses/i2c-rcar.c @@ -221,15 +221,28 @@ static int rcar_i2c_clock_calculate(struct rcar_i2c_priv *priv, struct device *dev) { struct clk *clkp = clk_get(NULL, "peripheral_clk"); + struct i2c_rcar_platform_data *pdata = dev->platform_data; u32 scgd, cdf; u32 round, ick; u32 scl; + u32 cdf_width; + u32 flags = pdata ? pdata->flags : 0; if (!clkp) { dev_err(dev, "there is no peripheral_clk\n"); return -EIO; } + switch (flags & I2C_RCAR_FLAGS_ICCCR_MASK) { + default: + case I2C_RCAR_FLAGS_ICCCR_IS_2BIT: + cdf_width = 2; + break; + case I2C_RCAR_FLAGS_ICCCR_IS_3BIT: + cdf_width = 3; + break; + } + /* * calculate SCL clock * see @@ -245,7 +258,7 @@ static int rcar_i2c_clock_calculate(struct rcar_i2c_priv *priv, * clkp : peripheral_clk * F[] : integer up-valuation */ - for (cdf = 0; cdf < 4; cdf++) { + for (cdf = 0; cdf < (1 << cdf_width); cdf++) { ick = clk_get_rate(clkp) / (1 + cdf); if (ick < 20000000) goto ick_find; @@ -287,7 +300,7 @@ scgd_find: /* * keep icccr value */ - priv->icccr = (scgd << 2 | cdf); + priv->icccr = (scgd << (cdf_width) | cdf); return 0; } diff --git a/include/linux/i2c/i2c-rcar.h b/include/linux/i2c/i2c-rcar.h index 496f5c2..572a6e5 100644 --- a/include/linux/i2c/i2c-rcar.h +++ b/include/linux/i2c/i2c-rcar.h @@ -5,6 +5,10 @@ struct i2c_rcar_platform_data { u32 bus_speed; + u32 flags; +#define I2C_RCAR_FLAGS_ICCCR_MASK (0xF << 0) +#define I2C_RCAR_FLAGS_ICCCR_IS_2BIT (0 << 0) /* default */ +#define I2C_RCAR_FLAGS_ICCCR_IS_3BIT (1 << 0) }; #endif /* __I2C_R_CAR_H__ */