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: 313338 Return-Path: X-Original-To: incoming-imx@patchwork.ozlabs.org Delivered-To: patchwork-incoming-imx@bilbo.ozlabs.org Received: from casper.infradead.org (casper.infradead.org [IPv6:2001:770:15f::2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 484862C00A7 for ; Thu, 23 Jan 2014 04:15:24 +1100 (EST) Received: from merlin.infradead.org ([2001:4978:20e::2]) by casper.infradead.org with esmtps (Exim 4.80.1 #2 (Red Hat Linux)) id 1W61OV-0006DW-Cq; Wed, 22 Jan 2014 17:15:15 +0000 Received: from localhost ([::1] helo=merlin.infradead.org) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1W61OS-0005Cu-U3; Wed, 22 Jan 2014 17:15:12 +0000 Received: from smtp4-g21.free.fr ([212.27.42.4]) by merlin.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1W61OO-0005C0-I4 for linux-arm-kernel@lists.infradead.org; Wed, 22 Jan 2014 17:15:09 +0000 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 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 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20140122_121509_133215_18C5B639 X-CRM114-Status: GOOD ( 14.49 ) X-Spam-Score: -1.2 (-) X-Spam-Report: SpamAssassin version 3.3.2 on merlin.infradead.org summary: Content analysis details: (-1.2 points) pts rule name description ---- ---------------------- -------------------------------------------------- -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no trust [212.27.42.4 listed in list.dnswl.org] 0.7 SPF_SOFTFAIL SPF: sender does not match SPF record (softfail) -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% [score: 0.0000] Cc: Denis Carikli , linux-fbdev@vger.kernel.org, linux-arm-kernel@lists.infradead.org, =?UTF-8?q?Eric=20B=C3=A9nard?= X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.15 Precedence: list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+incoming-imx=patchwork.ozlabs.org@lists.infradead.org List-Id: linux-imx-kernel.lists.patchwork.ozlabs.org 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