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/  |

Attachment: signature.asc
Description: Digital signature

Reply via email to