Hi Tony, On Mon, Aug 03, 2015 at 03:21:21AM -0700, Tony Lindgren wrote: > * Vignesh R <vigneshr@xxxxxx> [150731 04:00]: > > On 07/31/2015 01:44 AM, Dmitry Torokhov wrote: > > > Instead of having each i2c driver individually parse device tree data in > > > case it or platform supports separate wakeup interrupt, and handle > > > enabling and disabling wakeup interrupts in their power management > > > routines, let's have i2c core do that for us. > > Good idea, yes the dedicated wake-up interrupts can be handled > at the bus level to keep device drivers generic. > > One question below though.. > > > > @@ -639,11 +640,13 @@ static int i2c_device_probe(struct device *dev) > > > if (!client->irq) { > > > int irq = -ENOENT; > > > > > > - if (dev->of_node) > > > - irq = of_irq_get(dev->of_node, 0); > > > - else if (ACPI_COMPANION(dev)) > > > + if (dev->of_node) { > > > + irq = of_irq_get_byname(dev->of_node, "irq"); > > > + if (irq == -EINVAL || irq == -ENODATA) > > > + irq = of_irq_get(dev->of_node, 0); > > > + } else if (ACPI_COMPANION(dev)) { > > > irq = acpi_dev_gpio_irq_get(ACPI_COMPANION(dev), 0); > > > - > > > + } > > > if (irq == -EPROBE_DEFER) > > > return irq; > > > if (irq < 0) > > > @@ -659,20 +662,47 @@ static int i2c_device_probe(struct device *dev) > > > if (!device_can_wakeup(&client->dev)) > > > device_init_wakeup(&client->dev, > > > client->flags & I2C_CLIENT_WAKE); > > > + > > > + if (device_can_wakeup(&client->dev)) { > > > + int wakeirq = -ENOENT; > > > + > > > + if (dev->of_node) { > > > + wakeirq = of_irq_get_byname(dev->of_node, "wakeup"); > > > + if (wakeirq == -EPROBE_DEFER) > > > + return wakeirq; > > > + } > > > + > > > + if (wakeirq > 0 && wakeirq != client->irq) > > > + status = dev_pm_set_dedicated_wake_irq(dev, wakeirq); > > > + else if (client->irq > 0) > > > + status = dev_pm_set_wake_irq(dev, wakeirq); > > > + else > > > + status = 0; > > Hmm why do we need the check for if (device_can_wakeup(&client->dev)))? Because of the code in device_wakeup_attach_irq(): ws = dev->power.wakeup; if (!ws) { dev_err(dev, "forgot to call call device_init_wakeup?\n"); return -EINVAL; } > > Also wondering about the dev vs &client->dev usage here.. But I take > you have checked that we end up calling the runtime PM calls of the > client instead of the i2c bus controller :) dev *is* clent->dev in this context: struct i2c_client *client = i2c_verify_client(dev); Thanks! -- Dmitry -- To unsubscribe from this list: send the line "unsubscribe linux-i2c" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html