From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753140AbbHCKV0 (ORCPT ); Mon, 3 Aug 2015 06:21:26 -0400 Received: from muru.com ([72.249.23.125]:39953 "EHLO muru.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752078AbbHCKVZ (ORCPT ); Mon, 3 Aug 2015 06:21:25 -0400 Date: Mon, 3 Aug 2015 03:21:21 -0700 From: Tony Lindgren To: Vignesh R Cc: Dmitry Torokhov , Wolfram Sang , Mika Westerberg , "Rafael J. Wysocki" , Ulf Hansson , Rob Herring , Mark Rutland , "linux-i2c@vger.kernel.org" , "linux-kernel@vger.kernel.org" Subject: Re: [PATCH] i2c: allow specifying separate wakeup interrupt in device tree 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 Content-Disposition: inline In-Reply-To: <55BB54B1.80603@ti.com> User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@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