From mboxrd@z Thu Jan 1 00:00:00 1970 From: Tony Lindgren Subject: Re: [PATCH] i2c: allow specifying separate wakeup interrupt in device tree Date: Mon, 3 Aug 2015 03:21:21 -0700 Message-ID: <20150803102121.GO16878@atomide.com> References: <20150730201431.GA5255@dtor-ws> <55BB54B1.80603@ti.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Return-path: Content-Disposition: inline In-Reply-To: <55BB54B1.80603-l0cyMroinI0@public.gmane.org> Sender: linux-i2c-owner-u79uwXL29TY76Z2rM5mHXA@public.gmane.org To: Vignesh R Cc: Dmitry Torokhov , Wolfram Sang , Mika Westerberg , "Rafael J. Wysocki" , Ulf Hansson , Rob Herring , Mark Rutland , "linux-i2c-u79uwXL29TY76Z2rM5mHXA@public.gmane.org" , "linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org" List-Id: linux-i2c@vger.kernel.org * Vignesh R [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)))? 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 :) Regards, Tony