From patchwork Wed Jan 22 17:09:34 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Denis Carikli X-Patchwork-Id: 3524211 Return-Path: X-Original-To: patchwork-linux-fbdev@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.19.201]) by patchwork2.web.kernel.org (Postfix) with ESMTP id B7DCBC02DC for ; Wed, 22 Jan 2014 17:09:59 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id E2A7920171 for ; Wed, 22 Jan 2014 17:09:54 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 6B31020155 for ; Wed, 22 Jan 2014 17:09:53 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752311AbaAVRJw (ORCPT ); Wed, 22 Jan 2014 12:09:52 -0500 Received: from smtp4-g21.free.fr ([212.27.42.4]:45314 "EHLO smtp4-g21.free.fr" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751979AbaAVRJw (ORCPT ); Wed, 22 Jan 2014 12:09:52 -0500 Received: from denis-N73SV.local.eukrea.com (unknown [88.170.243.169]) by smtp4-g21.free.fr (Postfix) with ESMTP id 6ED0F4C803F; Wed, 22 Jan 2014 18:09:40 +0100 (CET) From: Denis Carikli To: Sascha Hauer Cc: Denis Carikli , =?UTF-8?q?Eric=20B=C3=A9nard?= , linux-arm-kernel@lists.infradead.org, linux-fbdev@vger.kernel.org Subject: [PATCHv14][ 1/4] video: imxfb: Introduce regulator support. Date: Wed, 22 Jan 2014 18:09:34 +0100 Message-Id: <1390410577-22073-1-git-send-email-denis@eukrea.com> X-Mailer: git-send-email 1.7.9.5 MIME-Version: 1.0 Sender: linux-fbdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-fbdev@vger.kernel.org X-Spam-Status: No, score=-7.5 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_HI, RP_MATCHES_RCVD, UNPARSEABLE_RELAY autolearn=ham version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP This commit is based on the following commit by Fabio Estevam: 4344429 video: mxsfb: Introduce regulator support Cc: Eric BĂ©nard Cc: Sascha Hauer Cc: linux-arm-kernel@lists.infradead.org Cc: linux-fbdev@vger.kernel.org Signed-off-by: Denis Carikli --- ChangeLog v13->v14: - Remove people not concerned by this patch from the Cc list. - Simplified the regulator handling: The regulator-core now supplies a dummy regulator if one hasn't been hooked up explicitely. So we don't need to handle that case in the driver. The code has been updated to do that, and the error messages were updated accordingly. ChangeLog v9->v10: - Added a return 0; at the end of imxfb_disable_controller. ChangeLog v8->v9: - return an error if regulator_{enable,disable} fails in imxfb_{enable,disable}_controller, and use it. --- drivers/video/imxfb.c | 38 +++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-) diff --git a/drivers/video/imxfb.c b/drivers/video/imxfb.c index 44ee678..dd8a35d 100644 --- a/drivers/video/imxfb.c +++ b/drivers/video/imxfb.c @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -145,6 +146,7 @@ struct imxfb_info { struct clk *clk_ipg; struct clk *clk_ahb; struct clk *clk_per; + struct regulator *reg_lcd; enum imxfb_type devtype; bool enabled; @@ -561,14 +563,16 @@ static void imxfb_exit_backlight(struct imxfb_info *fbi) } #endif -static void imxfb_enable_controller(struct imxfb_info *fbi) +static int imxfb_enable_controller(struct imxfb_info *fbi) { - if (fbi->enabled) - return; + return 0; pr_debug("Enabling LCD controller\n"); + if (regulator_enable(fbi->reg_lcd)) + dev_err(&fbi->pdev->dev, "Failed to enable regulator.\n"); + writel(fbi->screen_dma, fbi->regs + LCDC_SSA); /* panning offset 0 (0 pixel offset) */ @@ -593,12 +597,14 @@ static void imxfb_enable_controller(struct imxfb_info *fbi) fbi->backlight_power(1); if (fbi->lcd_power) fbi->lcd_power(1); + + return 0; } -static void imxfb_disable_controller(struct imxfb_info *fbi) +static int imxfb_disable_controller(struct imxfb_info *fbi) { if (!fbi->enabled) - return; + return 0; pr_debug("Disabling LCD controller\n"); @@ -613,6 +619,11 @@ static void imxfb_disable_controller(struct imxfb_info *fbi) fbi->enabled = false; writel(0, fbi->regs + LCDC_RMCR); + + if(regulator_disable(fbi->reg_lcd)) + dev_err(&fbi->pdev->dev, "Failed to disable regulator.\n"); + + return 0; } static int imxfb_blank(int blank, struct fb_info *info) @@ -626,13 +637,12 @@ static int imxfb_blank(int blank, struct fb_info *info) case FB_BLANK_VSYNC_SUSPEND: case FB_BLANK_HSYNC_SUSPEND: case FB_BLANK_NORMAL: - imxfb_disable_controller(fbi); - break; + return imxfb_disable_controller(fbi); case FB_BLANK_UNBLANK: - imxfb_enable_controller(fbi); - break; + return imxfb_enable_controller(fbi); } + return 0; } @@ -734,8 +744,7 @@ static int imxfb_suspend(struct platform_device *dev, pm_message_t state) pr_debug("%s\n", __func__); - imxfb_disable_controller(fbi); - return 0; + return imxfb_disable_controller(fbi); } static int imxfb_resume(struct platform_device *dev) @@ -745,8 +754,7 @@ static int imxfb_resume(struct platform_device *dev) pr_debug("%s\n", __func__); - imxfb_enable_controller(fbi); - return 0; + return imxfb_enable_controller(fbi); } #else #define imxfb_suspend NULL @@ -1020,6 +1028,10 @@ static int imxfb_probe(struct platform_device *pdev) goto failed_register; } + fbi->reg_lcd = devm_regulator_get(&pdev->dev, "lcd"); + if (IS_ERR(fbi->reg_lcd)) + return PTR_ERR(fbi->reg_lcd); + imxfb_enable_controller(fbi); fbi->pdev = pdev; #ifdef PWMR_BACKLIGHT_AVAILABLE