From patchwork Sun Mar 22 21:13:13 2009 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Rafael Wysocki X-Patchwork-Id: 13612 Received: from vger.kernel.org (vger.kernel.org [209.132.176.167]) by demeter.kernel.org (8.14.2/8.14.2) with ESMTP id n2MLDhe9008495 for ; Sun, 22 Mar 2009 21:13:47 GMT Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1756084AbZCVVNr (ORCPT ); Sun, 22 Mar 2009 17:13:47 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1756057AbZCVVNr (ORCPT ); Sun, 22 Mar 2009 17:13:47 -0400 Received: from ogre.sisk.pl ([217.79.144.158]:54604 "EHLO ogre.sisk.pl" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1755320AbZCVVNp (ORCPT ); Sun, 22 Mar 2009 17:13:45 -0400 Received: from localhost (localhost.localdomain [127.0.0.1]) by ogre.sisk.pl (Postfix) with ESMTP id 6E8F6119EDA; Sun, 22 Mar 2009 19:34:07 +0100 (CET) Received: from ogre.sisk.pl ([127.0.0.1]) by localhost (ogre.sisk.pl [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 27316-03; Sun, 22 Mar 2009 19:33:57 +0100 (CET) Received: from tosh.localnet (220-bem-13.acn.waw.pl [82.210.184.220]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (No client certificate requested) by ogre.sisk.pl (Postfix) with ESMTP id 19EA412E073; Sun, 22 Mar 2009 19:33:57 +0100 (CET) From: "Rafael J. Wysocki" To: Jesse Barnes Subject: [RFC][PATCH 2/2] radeonfb: Avoid open coding of PCI PM operations Date: Sun, 22 Mar 2009 22:13:13 +0100 User-Agent: KMail/1.11.1 (Linux/2.6.29-rc8-tst; KDE/4.2.1; x86_64; ; ) Cc: Benjamin Herrenschmidt , Linux PCI , pm list , LKML , Linus Torvalds , Andrew Morton References: <200903210003.55161.rjw@sisk.pl> <200903222208.22434.rjw@sisk.pl> In-Reply-To: <200903222208.22434.rjw@sisk.pl> MIME-Version: 1.0 Content-Disposition: inline Message-Id: <200903222213.14186.rjw@sisk.pl> X-Virus-Scanned: amavisd-new at ogre.sisk.pl using MkS_Vir for Linux Sender: linux-pci-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-pci@vger.kernel.org From: Rafael J. Wysocki The radeonfb driver uses open coded programming of the low power state D2 into the device, because it has to handle some chips that don't follow the specification. Avoid that by making it use __pci_set_power_state() for this purpose. Signed-off-by: Rafael J. Wysocki --- drivers/video/aty/radeon_pm.c | 26 +++----------------------- 1 file changed, 3 insertions(+), 23 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe linux-pci" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Index: linux-2.6/drivers/video/aty/radeon_pm.c =================================================================== --- linux-2.6.orig/drivers/video/aty/radeon_pm.c +++ linux-2.6/drivers/video/aty/radeon_pm.c @@ -2507,25 +2507,6 @@ static void radeon_reinitialize_QW(struc #endif /* CONFIG_PPC_OF */ -static void radeonfb_whack_power_state(struct radeonfb_info *rinfo, pci_power_t state) -{ - u16 pwr_cmd; - - for (;;) { - pci_read_config_word(rinfo->pdev, - rinfo->pm_reg+PCI_PM_CTRL, - &pwr_cmd); - if (pwr_cmd & 2) - break; - pwr_cmd = (pwr_cmd & ~PCI_PM_CTRL_STATE_MASK) | 2; - pci_write_config_word(rinfo->pdev, - rinfo->pm_reg+PCI_PM_CTRL, - pwr_cmd); - msleep(500); - } - rinfo->pdev->current_state = state; -} - static void radeon_set_suspend(struct radeonfb_info *rinfo, int suspend) { u32 tmp; @@ -2578,11 +2559,10 @@ static void radeon_set_suspend(struct ra pci_disable_device(rinfo->pdev); pci_save_state(rinfo->pdev); /* The chip seems to need us to whack the PM register - * repeatedly until it sticks. We do that -prior- to - * calling pci_set_power_state() + * repeatedly until it sticks. However, with the 500 ms delay, + * it's better to give up after 10 unsuccessful attempts. */ - radeonfb_whack_power_state(rinfo, PCI_D2); - pci_set_power_state(rinfo->pdev, PCI_D2); + __pci_set_power_state(rinfo->pdev, PCI_D2, 10, 500); } else { printk(KERN_DEBUG "radeonfb (%s): switching to D0 state...\n", pci_name(rinfo->pdev));