On Thu, Sep 27, 2012 at 11:44:25PM -0700, Kuninori Morimoto wrote: > R-Car I2C is similar with SH7760 I2C. > But the SH7760 I2C driver had many workaround operations, since H/W had bugs. > Thus, it was pointless to keep compatible between SH7760 and R-Car I2C > drivers. > This patch creates new Renesas R-Car I2C driver. > > Signed-off-by: Kuninori Morimoto <[email protected]>
Only minor issues which might be fixed later. Applied to -next.
> +static void rcar_i2c_write(struct rcar_i2c_priv *priv, int reg, u32 val)
> +{
> + writel(val, priv->io + reg);
> +}
> +
> +static u32 rcar_i2c_read(struct rcar_i2c_priv *priv, int reg)
> +{
> + return readl(priv->io + reg);
> +}
Not sure if those needed encapsulation.
...
> +static int rcar_i2c_irq_send(struct rcar_i2c_priv *priv, u32 msr)
> +{
> + struct i2c_msg *msg = priv->msg;
> +
> + /*
> + * FIXME
> + * sometimes, unknown interrupt happened.
> + * Do nothing
> + */
> + if (!(msr & MDE))
> + return 0;
Uh, is this a known hardware flaw?
...
> +static int __devinit rcar_i2c_probe(struct platform_device *pdev)
> +{
> + struct i2c_rcar_platform_data *pdata = pdev->dev.platform_data;
> + struct rcar_i2c_priv *priv;
> + struct i2c_adapter *adap;
> + struct resource *res;
> + struct device *dev = &pdev->dev;
> + u32 bus_speed;
> + int ret;
> +
> + res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
> + if (!res) {
> + dev_err(dev, "no mmio resources\n");
> + return -ENODEV;
> + }
> +
> + priv = devm_kzalloc(dev, sizeof(struct rcar_i2c_priv), GFP_KERNEL);
> + if (!priv) {
> + dev_err(dev, "no mem for private data\n");
> + return -ENOMEM;
> + }
> +
> + bus_speed = 100000; /* default 100 kHz */
> + if (pdata && pdata->bus_speed)
> + bus_speed = pdata->bus_speed;
> + ret = rcar_i2c_clock_calculate(priv, bus_speed, dev);
> + if (ret < 0)
> + return ret;
> +
> + priv->io = devm_ioremap(dev, res->start, resource_size(res));
devm_request_mem_region is missing. Or use the helper
devm_request_and_ioremap.
> + if (!priv->io) {
> + dev_err(dev, "cannot ioremap\n");
> + return -ENODEV;
> + }
> +
> + priv->irq = platform_get_irq(pdev, 0);
> + init_waitqueue_head(&priv->wait);
> + spin_lock_init(&priv->lock);
> +
> + adap = &priv->adap;
> + adap->nr = pdev->id;
> + adap->algo = &rcar_i2c_algo;
> + adap->class = I2C_CLASS_HWMON | I2C_CLASS_SPD;
> + adap->retries = 3;
Do you really need the class?
Rest looks good.
--
Pengutronix e.K. | Wolfram Sang |
Industrial Linux Solutions | http://www.pengutronix.de/ |
signature.asc
Description: Digital signature
