dss.c revision 04c742c3dccac296fdc52b464bd0491ffe88de23
1559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen/* 2559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen * linux/drivers/video/omap2/dss/dss.c 3559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen * 4559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen * Copyright (C) 2009 Nokia Corporation 5559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen * Author: Tomi Valkeinen <tomi.valkeinen@nokia.com> 6559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen * 7559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen * Some code and ideas taken from drivers/video/omap/ driver 8559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen * by Imre Deak. 9559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen * 10559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen * This program is free software; you can redistribute it and/or modify it 11559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen * under the terms of the GNU General Public License version 2 as published by 12559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen * the Free Software Foundation. 13559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen * 14559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen * This program is distributed in the hope that it will be useful, but WITHOUT 15559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 16559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 17559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen * more details. 18559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen * 19559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen * You should have received a copy of the GNU General Public License along with 20559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen * this program. If not, see <http://www.gnu.org/licenses/>. 21559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen */ 22559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 23559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen#define DSS_SUBSYS_NAME "DSS" 24559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 25559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen#include <linux/kernel.h> 26559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen#include <linux/io.h> 27a8a359318530a779c8d28d86357d492adead5b1fPaul Gortmaker#include <linux/export.h> 28559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen#include <linux/err.h> 29559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen#include <linux/delay.h> 30559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen#include <linux/seq_file.h> 31559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen#include <linux/clk.h> 3224e6289c029b0cf5b4f75e12c1b66000d441c9edTomi Valkeinen#include <linux/platform_device.h> 334fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen#include <linux/pm_runtime.h> 34559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 35a0b38cc4d35e095f14ab0f486135f8a619ebfc14Tomi Valkeinen#include <video/omapdss.h> 362c799cef4d145af2182594a41cb5e5b42f2535c5Tony Lindgren 372c799cef4d145af2182594a41cb5e5b42f2535c5Tony Lindgren#include <plat/cpu.h> 388b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy#include <plat/clock.h> 392c799cef4d145af2182594a41cb5e5b42f2535c5Tony Lindgren 40559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen#include "dss.h" 416ec549e50b192105ede7bb289a31da6f6e1a61e9Tomi Valkeinen#include "dss_features.h" 42559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 43559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen#define DSS_SZ_REGS SZ_512 44559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 45559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinenstruct dss_reg { 46559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen u16 idx; 47559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen}; 48559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 49559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen#define DSS_REG(idx) ((const struct dss_reg) { idx }) 50559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 51559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen#define DSS_REVISION DSS_REG(0x0000) 52559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen#define DSS_SYSCONFIG DSS_REG(0x0010) 53559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen#define DSS_SYSSTATUS DSS_REG(0x0014) 54559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen#define DSS_CONTROL DSS_REG(0x0040) 55559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen#define DSS_SDI_CONTROL DSS_REG(0x0044) 56559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen#define DSS_PLL_CONTROL DSS_REG(0x0048) 57559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen#define DSS_SDI_STATUS DSS_REG(0x005C) 58559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 59559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen#define REG_GET(idx, start, end) \ 60559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen FLD_GET(dss_read_reg(idx), start, end) 61559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 62559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen#define REG_FLD_MOD(idx, val, start, end) \ 63559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen dss_write_reg(idx, FLD_MOD(dss_read_reg(idx), val, start, end)) 64559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 65559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinenstatic struct { 6696c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamy struct platform_device *pdev; 67559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen void __iomem *base; 684fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 69559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen struct clk *dpll4_m4_ck; 704fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen struct clk *dss_clk; 71559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 72559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen unsigned long cache_req_pck; 73559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen unsigned long cache_prate; 74559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen struct dss_clock_info cache_dss_cinfo; 75559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen struct dispc_clock_info cache_dispc_cinfo; 76559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 775a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja enum omap_dss_clk_source dsi_clk_source[MAX_NUM_DSI]; 7889a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja enum omap_dss_clk_source dispc_clk_source; 7989a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja enum omap_dss_clk_source lcd_clk_source[MAX_DSS_LCD_MANAGERS]; 802f18c4d89861fc1abdfa2531ba76017acb78edc5Tomi Valkeinen 8169f06054aad122b314cd64fdafdf14fc3b8e5b7cTomi Valkeinen bool ctx_valid; 82559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen u32 ctx[DSS_SZ_REGS / sizeof(u32)]; 83559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen} dss; 84559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 85235e7dba0264d4c6e56ee217fc7ef6d80da5eb67Archit Tanejastatic const char * const dss_generic_clk_source_names[] = { 8689a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja [OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC] = "DSI_PLL_HSDIV_DISPC", 8789a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja [OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DSI] = "DSI_PLL_HSDIV_DSI", 8889a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja [OMAP_DSS_CLK_SRC_FCK] = "DSS_FCK", 89067a57e48e302863eb2d5ac0900ae9ae65dbc8c3Archit Taneja}; 90067a57e48e302863eb2d5ac0900ae9ae65dbc8c3Archit Taneja 91559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinenstatic inline void dss_write_reg(const struct dss_reg idx, u32 val) 92559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen{ 93559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen __raw_writel(val, dss.base + idx.idx); 94559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen} 95559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 96559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinenstatic inline u32 dss_read_reg(const struct dss_reg idx) 97559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen{ 98559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen return __raw_readl(dss.base + idx.idx); 99559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen} 100559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 101559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen#define SR(reg) \ 102559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen dss.ctx[(DSS_##reg).idx / sizeof(u32)] = dss_read_reg(DSS_##reg) 103559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen#define RR(reg) \ 104559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen dss_write_reg(DSS_##reg, dss.ctx[(DSS_##reg).idx / sizeof(u32)]) 105559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 1064fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic void dss_save_context(void) 107559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen{ 1084fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen DSSDBG("dss_save_context\n"); 109559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 110559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen SR(CONTROL); 111559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 1126ec549e50b192105ede7bb289a31da6f6e1a61e9Tomi Valkeinen if (dss_feat_get_supported_displays(OMAP_DSS_CHANNEL_LCD) & 1136ec549e50b192105ede7bb289a31da6f6e1a61e9Tomi Valkeinen OMAP_DISPLAY_TYPE_SDI) { 1146ec549e50b192105ede7bb289a31da6f6e1a61e9Tomi Valkeinen SR(SDI_CONTROL); 1156ec549e50b192105ede7bb289a31da6f6e1a61e9Tomi Valkeinen SR(PLL_CONTROL); 1166ec549e50b192105ede7bb289a31da6f6e1a61e9Tomi Valkeinen } 11769f06054aad122b314cd64fdafdf14fc3b8e5b7cTomi Valkeinen 11869f06054aad122b314cd64fdafdf14fc3b8e5b7cTomi Valkeinen dss.ctx_valid = true; 11969f06054aad122b314cd64fdafdf14fc3b8e5b7cTomi Valkeinen 12069f06054aad122b314cd64fdafdf14fc3b8e5b7cTomi Valkeinen DSSDBG("context saved\n"); 121559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen} 122559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 1234fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic void dss_restore_context(void) 124559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen{ 1254fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen DSSDBG("dss_restore_context\n"); 126559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 12769f06054aad122b314cd64fdafdf14fc3b8e5b7cTomi Valkeinen if (!dss.ctx_valid) 12869f06054aad122b314cd64fdafdf14fc3b8e5b7cTomi Valkeinen return; 12969f06054aad122b314cd64fdafdf14fc3b8e5b7cTomi Valkeinen 130559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen RR(CONTROL); 131559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 1326ec549e50b192105ede7bb289a31da6f6e1a61e9Tomi Valkeinen if (dss_feat_get_supported_displays(OMAP_DSS_CHANNEL_LCD) & 1336ec549e50b192105ede7bb289a31da6f6e1a61e9Tomi Valkeinen OMAP_DISPLAY_TYPE_SDI) { 1346ec549e50b192105ede7bb289a31da6f6e1a61e9Tomi Valkeinen RR(SDI_CONTROL); 1356ec549e50b192105ede7bb289a31da6f6e1a61e9Tomi Valkeinen RR(PLL_CONTROL); 1366ec549e50b192105ede7bb289a31da6f6e1a61e9Tomi Valkeinen } 13769f06054aad122b314cd64fdafdf14fc3b8e5b7cTomi Valkeinen 13869f06054aad122b314cd64fdafdf14fc3b8e5b7cTomi Valkeinen DSSDBG("context restored\n"); 139559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen} 140559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 141559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen#undef SR 142559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen#undef RR 143559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 144559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinenvoid dss_sdi_init(u8 datapairs) 145559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen{ 146559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen u32 l; 147559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 148559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen BUG_ON(datapairs > 3 || datapairs < 1); 149559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 150559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen l = dss_read_reg(DSS_SDI_CONTROL); 151559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen l = FLD_MOD(l, 0xf, 19, 15); /* SDI_PDIV */ 152559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen l = FLD_MOD(l, datapairs-1, 3, 2); /* SDI_PRSEL */ 153559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen l = FLD_MOD(l, 2, 1, 0); /* SDI_BWSEL */ 154559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen dss_write_reg(DSS_SDI_CONTROL, l); 155559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 156559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen l = dss_read_reg(DSS_PLL_CONTROL); 157559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen l = FLD_MOD(l, 0x7, 25, 22); /* SDI_PLL_FREQSEL */ 158559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen l = FLD_MOD(l, 0xb, 16, 11); /* SDI_PLL_REGN */ 159559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen l = FLD_MOD(l, 0xb4, 10, 1); /* SDI_PLL_REGM */ 160559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen dss_write_reg(DSS_PLL_CONTROL, l); 161559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen} 162559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 163559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinenint dss_sdi_enable(void) 164559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen{ 165559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen unsigned long timeout; 166559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 167559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen dispc_pck_free_enable(1); 168559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 169559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen /* Reset SDI PLL */ 170559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen REG_FLD_MOD(DSS_PLL_CONTROL, 1, 18, 18); /* SDI_PLL_SYSRESET */ 171559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen udelay(1); /* wait 2x PCLK */ 172559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 173559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen /* Lock SDI PLL */ 174559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen REG_FLD_MOD(DSS_PLL_CONTROL, 1, 28, 28); /* SDI_PLL_GOBIT */ 175559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 176559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen /* Waiting for PLL lock request to complete */ 177559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen timeout = jiffies + msecs_to_jiffies(500); 178559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen while (dss_read_reg(DSS_SDI_STATUS) & (1 << 6)) { 179559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen if (time_after_eq(jiffies, timeout)) { 180559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen DSSERR("PLL lock request timed out\n"); 181559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen goto err1; 182559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen } 183559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen } 184559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 185559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen /* Clearing PLL_GO bit */ 186559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen REG_FLD_MOD(DSS_PLL_CONTROL, 0, 28, 28); 187559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 188559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen /* Waiting for PLL to lock */ 189559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen timeout = jiffies + msecs_to_jiffies(500); 190559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen while (!(dss_read_reg(DSS_SDI_STATUS) & (1 << 5))) { 191559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen if (time_after_eq(jiffies, timeout)) { 192559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen DSSERR("PLL lock timed out\n"); 193559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen goto err1; 194559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen } 195559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen } 196559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 197559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen dispc_lcd_enable_signal(1); 198559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 199559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen /* Waiting for SDI reset to complete */ 200559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen timeout = jiffies + msecs_to_jiffies(500); 201559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen while (!(dss_read_reg(DSS_SDI_STATUS) & (1 << 2))) { 202559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen if (time_after_eq(jiffies, timeout)) { 203559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen DSSERR("SDI reset timed out\n"); 204559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen goto err2; 205559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen } 206559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen } 207559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 208559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen return 0; 209559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 210559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen err2: 211559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen dispc_lcd_enable_signal(0); 212559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen err1: 213559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen /* Reset SDI PLL */ 214559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen REG_FLD_MOD(DSS_PLL_CONTROL, 0, 18, 18); /* SDI_PLL_SYSRESET */ 215559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 216559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen dispc_pck_free_enable(0); 217559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 218559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen return -ETIMEDOUT; 219559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen} 220559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 221559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinenvoid dss_sdi_disable(void) 222559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen{ 223559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen dispc_lcd_enable_signal(0); 224559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 225559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen dispc_pck_free_enable(0); 226559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 227559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen /* Reset SDI PLL */ 228559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen REG_FLD_MOD(DSS_PLL_CONTROL, 0, 18, 18); /* SDI_PLL_SYSRESET */ 229559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen} 230559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 23189a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Tanejaconst char *dss_get_generic_clk_source_name(enum omap_dss_clk_source clk_src) 232067a57e48e302863eb2d5ac0900ae9ae65dbc8c3Archit Taneja{ 233235e7dba0264d4c6e56ee217fc7ef6d80da5eb67Archit Taneja return dss_generic_clk_source_names[clk_src]; 234067a57e48e302863eb2d5ac0900ae9ae65dbc8c3Archit Taneja} 235067a57e48e302863eb2d5ac0900ae9ae65dbc8c3Archit Taneja 2364fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 237559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinenvoid dss_dump_clocks(struct seq_file *s) 238559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen{ 239559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen unsigned long dpll4_ck_rate; 240559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen unsigned long dpll4_m4_ck_rate; 2410acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen const char *fclk_name, *fclk_real_name; 2420acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen unsigned long fclk_rate; 243559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 2444fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen if (dss_runtime_get()) 2454fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen return; 246559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 247559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen seq_printf(s, "- DSS -\n"); 248559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 24989a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja fclk_name = dss_get_generic_clk_source_name(OMAP_DSS_CLK_SRC_FCK); 25089a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja fclk_real_name = dss_feat_get_clk_source_name(OMAP_DSS_CLK_SRC_FCK); 2514fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen fclk_rate = clk_get_rate(dss.dss_clk); 252559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 2530acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen if (dss.dpll4_m4_ck) { 2540acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen dpll4_ck_rate = clk_get_rate(clk_get_parent(dss.dpll4_m4_ck)); 2550acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen dpll4_m4_ck_rate = clk_get_rate(dss.dpll4_m4_ck); 2560acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen 2570acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen seq_printf(s, "dpll4_ck %lu\n", dpll4_ck_rate); 2580acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen 2592de110868f455b74e91111801ce63a3c9d06f091Murthy, Raghuveer if (cpu_is_omap3630() || cpu_is_omap44xx()) 2600acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen seq_printf(s, "%s (%s) = %lu / %lu = %lu\n", 2610acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen fclk_name, fclk_real_name, 2620acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen dpll4_ck_rate, 2630acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen dpll4_ck_rate / dpll4_m4_ck_rate, 2640acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen fclk_rate); 2650acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen else 2660acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen seq_printf(s, "%s (%s) = %lu / %lu * 2 = %lu\n", 2670acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen fclk_name, fclk_real_name, 2680acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen dpll4_ck_rate, 2690acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen dpll4_ck_rate / dpll4_m4_ck_rate, 2700acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen fclk_rate); 2710acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen } else { 2720acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen seq_printf(s, "%s (%s) = %lu\n", 2730acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen fclk_name, fclk_real_name, 2740acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen fclk_rate); 2750acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen } 276559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 2774fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dss_runtime_put(); 278559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen} 279559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 280559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinenvoid dss_dump_regs(struct seq_file *s) 281559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen{ 282559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen#define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, dss_read_reg(r)) 283559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 2844fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen if (dss_runtime_get()) 2854fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen return; 286559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 287559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen DUMPREG(DSS_REVISION); 288559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen DUMPREG(DSS_SYSCONFIG); 289559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen DUMPREG(DSS_SYSSTATUS); 290559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen DUMPREG(DSS_CONTROL); 2916ec549e50b192105ede7bb289a31da6f6e1a61e9Tomi Valkeinen 2926ec549e50b192105ede7bb289a31da6f6e1a61e9Tomi Valkeinen if (dss_feat_get_supported_displays(OMAP_DSS_CHANNEL_LCD) & 2936ec549e50b192105ede7bb289a31da6f6e1a61e9Tomi Valkeinen OMAP_DISPLAY_TYPE_SDI) { 2946ec549e50b192105ede7bb289a31da6f6e1a61e9Tomi Valkeinen DUMPREG(DSS_SDI_CONTROL); 2956ec549e50b192105ede7bb289a31da6f6e1a61e9Tomi Valkeinen DUMPREG(DSS_PLL_CONTROL); 2966ec549e50b192105ede7bb289a31da6f6e1a61e9Tomi Valkeinen DUMPREG(DSS_SDI_STATUS); 2976ec549e50b192105ede7bb289a31da6f6e1a61e9Tomi Valkeinen } 298559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 2994fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dss_runtime_put(); 300559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen#undef DUMPREG 301559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen} 302559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 30389a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Tanejavoid dss_select_dispc_clk_source(enum omap_dss_clk_source clk_src) 3042f18c4d89861fc1abdfa2531ba76017acb78edc5Tomi Valkeinen{ 305a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev; 3062f18c4d89861fc1abdfa2531ba76017acb78edc5Tomi Valkeinen int b; 307ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja u8 start, end; 3082f18c4d89861fc1abdfa2531ba76017acb78edc5Tomi Valkeinen 30966534e8e936a0b926863df90054dc59826d70528Archit Taneja switch (clk_src) { 31089a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja case OMAP_DSS_CLK_SRC_FCK: 31166534e8e936a0b926863df90054dc59826d70528Archit Taneja b = 0; 31266534e8e936a0b926863df90054dc59826d70528Archit Taneja break; 31389a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja case OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC: 31466534e8e936a0b926863df90054dc59826d70528Archit Taneja b = 1; 315a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsidev = dsi_get_dsidev_from_id(0); 316a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_wait_pll_hsdiv_dispc_active(dsidev); 31766534e8e936a0b926863df90054dc59826d70528Archit Taneja break; 3185a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja case OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC: 3195a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja b = 2; 3205a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja dsidev = dsi_get_dsidev_from_id(1); 3215a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja dsi_wait_pll_hsdiv_dispc_active(dsidev); 3225a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja break; 32366534e8e936a0b926863df90054dc59826d70528Archit Taneja default: 32466534e8e936a0b926863df90054dc59826d70528Archit Taneja BUG(); 32566534e8e936a0b926863df90054dc59826d70528Archit Taneja } 326e406f9079b993f4d5d7b5a3452b11df81ff2aef0Tomi Valkeinen 327ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja dss_feat_get_reg_field(FEAT_REG_DISPC_CLK_SWITCH, &start, &end); 328ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja 329ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja REG_FLD_MOD(DSS_CONTROL, b, start, end); /* DISPC_CLK_SWITCH */ 3302f18c4d89861fc1abdfa2531ba76017acb78edc5Tomi Valkeinen 3312f18c4d89861fc1abdfa2531ba76017acb78edc5Tomi Valkeinen dss.dispc_clk_source = clk_src; 3322f18c4d89861fc1abdfa2531ba76017acb78edc5Tomi Valkeinen} 3332f18c4d89861fc1abdfa2531ba76017acb78edc5Tomi Valkeinen 3345a8b572d832772722c3b3b7578e7fb968560fcf3Archit Tanejavoid dss_select_dsi_clk_source(int dsi_module, 3355a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja enum omap_dss_clk_source clk_src) 336559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen{ 337a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev; 338a2e5d82758a82b4848f00b1f28f8f71920e1b076Archit Taneja int b, pos; 3392f18c4d89861fc1abdfa2531ba76017acb78edc5Tomi Valkeinen 34066534e8e936a0b926863df90054dc59826d70528Archit Taneja switch (clk_src) { 34189a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja case OMAP_DSS_CLK_SRC_FCK: 34266534e8e936a0b926863df90054dc59826d70528Archit Taneja b = 0; 34366534e8e936a0b926863df90054dc59826d70528Archit Taneja break; 34489a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja case OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DSI: 3455a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja BUG_ON(dsi_module != 0); 34666534e8e936a0b926863df90054dc59826d70528Archit Taneja b = 1; 347a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsidev = dsi_get_dsidev_from_id(0); 348a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_wait_pll_hsdiv_dsi_active(dsidev); 34966534e8e936a0b926863df90054dc59826d70528Archit Taneja break; 3505a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja case OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DSI: 3515a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja BUG_ON(dsi_module != 1); 3525a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja b = 1; 3535a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja dsidev = dsi_get_dsidev_from_id(1); 3545a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja dsi_wait_pll_hsdiv_dsi_active(dsidev); 3555a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja break; 35666534e8e936a0b926863df90054dc59826d70528Archit Taneja default: 35766534e8e936a0b926863df90054dc59826d70528Archit Taneja BUG(); 35866534e8e936a0b926863df90054dc59826d70528Archit Taneja } 359e406f9079b993f4d5d7b5a3452b11df81ff2aef0Tomi Valkeinen 360a2e5d82758a82b4848f00b1f28f8f71920e1b076Archit Taneja pos = dsi_module == 0 ? 1 : 10; 361a2e5d82758a82b4848f00b1f28f8f71920e1b076Archit Taneja REG_FLD_MOD(DSS_CONTROL, b, pos, pos); /* DSIx_CLK_SWITCH */ 3622f18c4d89861fc1abdfa2531ba76017acb78edc5Tomi Valkeinen 3635a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja dss.dsi_clk_source[dsi_module] = clk_src; 364559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen} 365559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 366ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Tanejavoid dss_select_lcd_clk_source(enum omap_channel channel, 36789a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja enum omap_dss_clk_source clk_src) 368ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja{ 369a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev; 370ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja int b, ix, pos; 371ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja 372ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja if (!dss_has_feature(FEAT_LCD_CLK_SRC)) 373ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja return; 374ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja 375ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja switch (clk_src) { 37689a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja case OMAP_DSS_CLK_SRC_FCK: 377ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja b = 0; 378ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja break; 37989a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja case OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC: 380ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja BUG_ON(channel != OMAP_DSS_CHANNEL_LCD); 381ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja b = 1; 382a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsidev = dsi_get_dsidev_from_id(0); 383a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_wait_pll_hsdiv_dispc_active(dsidev); 384ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja break; 3855a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja case OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC: 3865a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja BUG_ON(channel != OMAP_DSS_CHANNEL_LCD2); 3875a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja b = 1; 3885a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja dsidev = dsi_get_dsidev_from_id(1); 3895a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja dsi_wait_pll_hsdiv_dispc_active(dsidev); 3905a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja break; 391ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja default: 392ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja BUG(); 393ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja } 394ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja 395ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja pos = channel == OMAP_DSS_CHANNEL_LCD ? 0 : 12; 396ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja REG_FLD_MOD(DSS_CONTROL, b, pos, pos); /* LCDx_CLK_SWITCH */ 397ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja 398ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja ix = channel == OMAP_DSS_CHANNEL_LCD ? 0 : 1; 399ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja dss.lcd_clk_source[ix] = clk_src; 400ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja} 401ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja 40289a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Tanejaenum omap_dss_clk_source dss_get_dispc_clk_source(void) 403559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen{ 4042f18c4d89861fc1abdfa2531ba76017acb78edc5Tomi Valkeinen return dss.dispc_clk_source; 405559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen} 406559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 4075a8b572d832772722c3b3b7578e7fb968560fcf3Archit Tanejaenum omap_dss_clk_source dss_get_dsi_clk_source(int dsi_module) 408559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen{ 4095a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja return dss.dsi_clk_source[dsi_module]; 410559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen} 411559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 41289a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Tanejaenum omap_dss_clk_source dss_get_lcd_clk_source(enum omap_channel channel) 413ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja{ 41489976f2990a97820b73a1768371ee505b0ffc176Archit Taneja if (dss_has_feature(FEAT_LCD_CLK_SRC)) { 41589976f2990a97820b73a1768371ee505b0ffc176Archit Taneja int ix = channel == OMAP_DSS_CHANNEL_LCD ? 0 : 1; 41689976f2990a97820b73a1768371ee505b0ffc176Archit Taneja return dss.lcd_clk_source[ix]; 41789976f2990a97820b73a1768371ee505b0ffc176Archit Taneja } else { 41889976f2990a97820b73a1768371ee505b0ffc176Archit Taneja /* LCD_CLK source is the same as DISPC_FCLK source for 41989976f2990a97820b73a1768371ee505b0ffc176Archit Taneja * OMAP2 and OMAP3 */ 42089976f2990a97820b73a1768371ee505b0ffc176Archit Taneja return dss.dispc_clk_source; 42189976f2990a97820b73a1768371ee505b0ffc176Archit Taneja } 422ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja} 423ea75159ee6f00bd809f57a58e5505dc362382cc8Archit Taneja 424559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen/* calculate clock rates using dividers in cinfo */ 425559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinenint dss_calc_clock_rates(struct dss_clock_info *cinfo) 426559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen{ 4270acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen if (dss.dpll4_m4_ck) { 4280acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen unsigned long prate; 4292de110868f455b74e91111801ce63a3c9d06f091Murthy, Raghuveer u16 fck_div_max = 16; 430559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 4312de110868f455b74e91111801ce63a3c9d06f091Murthy, Raghuveer if (cpu_is_omap3630() || cpu_is_omap44xx()) 4322de110868f455b74e91111801ce63a3c9d06f091Murthy, Raghuveer fck_div_max = 32; 4332de110868f455b74e91111801ce63a3c9d06f091Murthy, Raghuveer 4342de110868f455b74e91111801ce63a3c9d06f091Murthy, Raghuveer if (cinfo->fck_div > fck_div_max || cinfo->fck_div == 0) 4350acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen return -EINVAL; 436559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 4370acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen prate = clk_get_rate(clk_get_parent(dss.dpll4_m4_ck)); 438559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 4390acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen cinfo->fck = prate / cinfo->fck_div; 4400acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen } else { 4410acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen if (cinfo->fck_div != 0) 4420acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen return -EINVAL; 4434fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen cinfo->fck = clk_get_rate(dss.dss_clk); 4440acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen } 445559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 446559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen return 0; 447559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen} 448559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 449559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinenint dss_set_clock_div(struct dss_clock_info *cinfo) 450559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen{ 4510acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen if (dss.dpll4_m4_ck) { 4520acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen unsigned long prate; 4530acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen int r; 454559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 455559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen prate = clk_get_rate(clk_get_parent(dss.dpll4_m4_ck)); 456559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen DSSDBG("dpll4_m4 = %ld\n", prate); 457559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 458559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen r = clk_set_rate(dss.dpll4_m4_ck, prate / cinfo->fck_div); 459559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen if (r) 460559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen return r; 4610acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen } else { 4620acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen if (cinfo->fck_div != 0) 4630acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen return -EINVAL; 464559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen } 465559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 466559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen DSSDBG("fck = %ld (%d)\n", cinfo->fck, cinfo->fck_div); 467559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 468559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen return 0; 469559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen} 470559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 471559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinenint dss_get_clock_div(struct dss_clock_info *cinfo) 472559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen{ 4734fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen cinfo->fck = clk_get_rate(dss.dss_clk); 474559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 4750acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen if (dss.dpll4_m4_ck) { 476559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen unsigned long prate; 4770acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen 478559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen prate = clk_get_rate(clk_get_parent(dss.dpll4_m4_ck)); 4790acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen 4802de110868f455b74e91111801ce63a3c9d06f091Murthy, Raghuveer if (cpu_is_omap3630() || cpu_is_omap44xx()) 481ac01bb7ea06a02c8dc9084b4ed59cb59efeceb39Kishore Y cinfo->fck_div = prate / (cinfo->fck); 482ac01bb7ea06a02c8dc9084b4ed59cb59efeceb39Kishore Y else 483ac01bb7ea06a02c8dc9084b4ed59cb59efeceb39Kishore Y cinfo->fck_div = prate / (cinfo->fck / 2); 484559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen } else { 485559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen cinfo->fck_div = 0; 486559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen } 487559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 488559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen return 0; 489559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen} 490559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 491559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinenunsigned long dss_get_dpll4_rate(void) 492559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen{ 4930acf659f1469725fb6e39d53af970f36c5f69a41Tomi Valkeinen if (dss.dpll4_m4_ck) 494559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen return clk_get_rate(clk_get_parent(dss.dpll4_m4_ck)); 495559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen else 496559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen return 0; 497559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen} 498559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 499559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinenint dss_calc_clock_div(bool is_tft, unsigned long req_pck, 500559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen struct dss_clock_info *dss_cinfo, 501559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen struct dispc_clock_info *dispc_cinfo) 502559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen{ 503559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen unsigned long prate; 504559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen struct dss_clock_info best_dss; 505559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen struct dispc_clock_info best_dispc; 506559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 507819d807c59af10cce1dcbb13539c2fb100953fcdArchit Taneja unsigned long fck, max_dss_fck; 508559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 5092de110868f455b74e91111801ce63a3c9d06f091Murthy, Raghuveer u16 fck_div, fck_div_max = 16; 510559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 511559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen int match = 0; 512559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen int min_fck_per_pck; 513559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 514559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen prate = dss_get_dpll4_rate(); 515559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 51631ef82377f1e0f1bc7d308ae4312e6cc5a431885Archit Taneja max_dss_fck = dss_feat_get_param_max(FEAT_PARAM_DSS_FCK); 517819d807c59af10cce1dcbb13539c2fb100953fcdArchit Taneja 5184fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen fck = clk_get_rate(dss.dss_clk); 519559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen if (req_pck == dss.cache_req_pck && 520559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen ((cpu_is_omap34xx() && prate == dss.cache_prate) || 521559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen dss.cache_dss_cinfo.fck == fck)) { 522559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen DSSDBG("dispc clock info found from cache.\n"); 523559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen *dss_cinfo = dss.cache_dss_cinfo; 524559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen *dispc_cinfo = dss.cache_dispc_cinfo; 525559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen return 0; 526559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen } 527559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 528559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen min_fck_per_pck = CONFIG_OMAP2_DSS_MIN_FCK_PER_PCK; 529559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 530559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen if (min_fck_per_pck && 531819d807c59af10cce1dcbb13539c2fb100953fcdArchit Taneja req_pck * min_fck_per_pck > max_dss_fck) { 532559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen DSSERR("Requested pixel clock not possible with the current " 533559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen "OMAP2_DSS_MIN_FCK_PER_PCK setting. Turning " 534559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen "the constraint off.\n"); 535559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen min_fck_per_pck = 0; 536559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen } 537559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 538559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinenretry: 539559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen memset(&best_dss, 0, sizeof(best_dss)); 540559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen memset(&best_dispc, 0, sizeof(best_dispc)); 541559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 5422de110868f455b74e91111801ce63a3c9d06f091Murthy, Raghuveer if (dss.dpll4_m4_ck == NULL) { 543559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen struct dispc_clock_info cur_dispc; 544559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen /* XXX can we change the clock on omap2? */ 5454fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen fck = clk_get_rate(dss.dss_clk); 546559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen fck_div = 1; 547559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 548559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen dispc_find_clk_divs(is_tft, req_pck, fck, &cur_dispc); 549559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen match = 1; 550559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 551559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen best_dss.fck = fck; 552559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen best_dss.fck_div = fck_div; 553559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 554559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen best_dispc = cur_dispc; 555559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 556559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen goto found; 5572de110868f455b74e91111801ce63a3c9d06f091Murthy, Raghuveer } else { 5582de110868f455b74e91111801ce63a3c9d06f091Murthy, Raghuveer if (cpu_is_omap3630() || cpu_is_omap44xx()) 5592de110868f455b74e91111801ce63a3c9d06f091Murthy, Raghuveer fck_div_max = 32; 5602de110868f455b74e91111801ce63a3c9d06f091Murthy, Raghuveer 5612de110868f455b74e91111801ce63a3c9d06f091Murthy, Raghuveer for (fck_div = fck_div_max; fck_div > 0; --fck_div) { 562559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen struct dispc_clock_info cur_dispc; 563559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 5642de110868f455b74e91111801ce63a3c9d06f091Murthy, Raghuveer if (fck_div_max == 32) 565ac01bb7ea06a02c8dc9084b4ed59cb59efeceb39Kishore Y fck = prate / fck_div; 566ac01bb7ea06a02c8dc9084b4ed59cb59efeceb39Kishore Y else 567ac01bb7ea06a02c8dc9084b4ed59cb59efeceb39Kishore Y fck = prate / fck_div * 2; 568559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 569819d807c59af10cce1dcbb13539c2fb100953fcdArchit Taneja if (fck > max_dss_fck) 570559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen continue; 571559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 572559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen if (min_fck_per_pck && 573559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen fck < req_pck * min_fck_per_pck) 574559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen continue; 575559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 576559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen match = 1; 577559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 578559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen dispc_find_clk_divs(is_tft, req_pck, fck, &cur_dispc); 579559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 580559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen if (abs(cur_dispc.pck - req_pck) < 581559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen abs(best_dispc.pck - req_pck)) { 582559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 583559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen best_dss.fck = fck; 584559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen best_dss.fck_div = fck_div; 585559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 586559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen best_dispc = cur_dispc; 587559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 588559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen if (cur_dispc.pck == req_pck) 589559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen goto found; 590559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen } 591559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen } 592559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen } 593559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 594559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinenfound: 595559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen if (!match) { 596559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen if (min_fck_per_pck) { 597559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen DSSERR("Could not find suitable clock settings.\n" 598559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen "Turning FCK/PCK constraint off and" 599559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen "trying again.\n"); 600559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen min_fck_per_pck = 0; 601559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen goto retry; 602559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen } 603559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 604559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen DSSERR("Could not find suitable clock settings.\n"); 605559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 606559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen return -EINVAL; 607559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen } 608559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 609559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen if (dss_cinfo) 610559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen *dss_cinfo = best_dss; 611559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen if (dispc_cinfo) 612559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen *dispc_cinfo = best_dispc; 613559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 614559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen dss.cache_req_pck = req_pck; 615559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen dss.cache_prate = prate; 616559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen dss.cache_dss_cinfo = best_dss; 617559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen dss.cache_dispc_cinfo = best_dispc; 618559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 619559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen return 0; 620559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen} 621559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 622559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinenvoid dss_set_venc_output(enum omap_dss_venc_type type) 623559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen{ 624559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen int l = 0; 625559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 626559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen if (type == OMAP_DSS_VENC_TYPE_COMPOSITE) 627559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen l = 0; 628559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen else if (type == OMAP_DSS_VENC_TYPE_SVIDEO) 629559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen l = 1; 630559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen else 631559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen BUG(); 632559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 633559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen /* venc out selection. 0 = comp, 1 = svideo */ 634559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen REG_FLD_MOD(DSS_CONTROL, l, 6, 6); 635559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen} 636559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 637559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinenvoid dss_set_dac_pwrdn_bgz(bool enable) 638559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen{ 639559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen REG_FLD_MOD(DSS_CONTROL, enable, 5, 5); /* DAC Power-Down Control */ 640559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen} 641559d67018950ced65c73358cd69c4bdd2b0c5dd6Tomi Valkeinen 6427ed024aa280cb38c8aa5c188d2d2c98f5daede10Mythri P Kvoid dss_select_hdmi_venc_clk_source(enum dss_hdmi_venc_clk_source_select hdmi) 6437ed024aa280cb38c8aa5c188d2d2c98f5daede10Mythri P K{ 6447ed024aa280cb38c8aa5c188d2d2c98f5daede10Mythri P K REG_FLD_MOD(DSS_CONTROL, hdmi, 15, 15); /* VENC_HDMI_SWITCH */ 6457ed024aa280cb38c8aa5c188d2d2c98f5daede10Mythri P K} 6467ed024aa280cb38c8aa5c188d2d2c98f5daede10Mythri P K 6474a61e267c84e98caeddcab25432a871bf1a599ddTomi Valkeinenenum dss_hdmi_venc_clk_source_select dss_get_hdmi_venc_clk_source(void) 6484a61e267c84e98caeddcab25432a871bf1a599ddTomi Valkeinen{ 6494a61e267c84e98caeddcab25432a871bf1a599ddTomi Valkeinen enum omap_display_type displays; 6504a61e267c84e98caeddcab25432a871bf1a599ddTomi Valkeinen 6514a61e267c84e98caeddcab25432a871bf1a599ddTomi Valkeinen displays = dss_feat_get_supported_displays(OMAP_DSS_CHANNEL_DIGIT); 6524a61e267c84e98caeddcab25432a871bf1a599ddTomi Valkeinen if ((displays & OMAP_DISPLAY_TYPE_HDMI) == 0) 6534a61e267c84e98caeddcab25432a871bf1a599ddTomi Valkeinen return DSS_VENC_TV_CLK; 6544a61e267c84e98caeddcab25432a871bf1a599ddTomi Valkeinen 6554a61e267c84e98caeddcab25432a871bf1a599ddTomi Valkeinen return REG_GET(DSS_CONTROL, 15, 15); 6564a61e267c84e98caeddcab25432a871bf1a599ddTomi Valkeinen} 6574a61e267c84e98caeddcab25432a871bf1a599ddTomi Valkeinen 6588b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamystatic int dss_get_clocks(void) 6598b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy{ 6604fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen struct clk *clk; 6618b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy int r; 6628b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy 6634fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen clk = clk_get(&dss.pdev->dev, "fck"); 6644fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen if (IS_ERR(clk)) { 6654fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen DSSERR("can't get clock fck\n"); 6664fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen r = PTR_ERR(clk); 6678b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy goto err; 668a1a0dccaea9e036200dc0b1070af1bfae06690fbSumit Semwal } 6698b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy 6704fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dss.dss_clk = clk; 6718b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy 67294c042ce589b6b81e5dc0020fce2d248940412bdTomi Valkeinen if (cpu_is_omap34xx()) { 6734fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen clk = clk_get(NULL, "dpll4_m4_ck"); 6744fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen if (IS_ERR(clk)) { 67594c042ce589b6b81e5dc0020fce2d248940412bdTomi Valkeinen DSSERR("Failed to get dpll4_m4_ck\n"); 6764fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen r = PTR_ERR(clk); 67794c042ce589b6b81e5dc0020fce2d248940412bdTomi Valkeinen goto err; 67894c042ce589b6b81e5dc0020fce2d248940412bdTomi Valkeinen } 67994c042ce589b6b81e5dc0020fce2d248940412bdTomi Valkeinen } else if (cpu_is_omap44xx()) { 6804fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen clk = clk_get(NULL, "dpll_per_m5x2_ck"); 6814fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen if (IS_ERR(clk)) { 68294c042ce589b6b81e5dc0020fce2d248940412bdTomi Valkeinen DSSERR("Failed to get dpll_per_m5x2_ck\n"); 6834fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen r = PTR_ERR(clk); 68494c042ce589b6b81e5dc0020fce2d248940412bdTomi Valkeinen goto err; 68594c042ce589b6b81e5dc0020fce2d248940412bdTomi Valkeinen } 68694c042ce589b6b81e5dc0020fce2d248940412bdTomi Valkeinen } else { /* omap24xx */ 6874fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen clk = NULL; 68894c042ce589b6b81e5dc0020fce2d248940412bdTomi Valkeinen } 68994c042ce589b6b81e5dc0020fce2d248940412bdTomi Valkeinen 6904fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dss.dpll4_m4_ck = clk; 69194c042ce589b6b81e5dc0020fce2d248940412bdTomi Valkeinen 6928b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy return 0; 6938b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy 6948b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamyerr: 6954fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen if (dss.dss_clk) 6964fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen clk_put(dss.dss_clk); 69794c042ce589b6b81e5dc0020fce2d248940412bdTomi Valkeinen if (dss.dpll4_m4_ck) 69894c042ce589b6b81e5dc0020fce2d248940412bdTomi Valkeinen clk_put(dss.dpll4_m4_ck); 6998b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy 7008b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy return r; 7018b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy} 7028b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy 7038b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamystatic void dss_put_clocks(void) 7048b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy{ 70594c042ce589b6b81e5dc0020fce2d248940412bdTomi Valkeinen if (dss.dpll4_m4_ck) 70694c042ce589b6b81e5dc0020fce2d248940412bdTomi Valkeinen clk_put(dss.dpll4_m4_ck); 7074fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen clk_put(dss.dss_clk); 7088b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy} 7098b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy 7104fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenint dss_runtime_get(void) 7118b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy{ 7124fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen int r; 7138b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy 7144fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen DSSDBG("dss_runtime_get\n"); 7158b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy 7164fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen r = pm_runtime_get_sync(&dss.pdev->dev); 7174fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen WARN_ON(r < 0); 7184fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen return r < 0 ? r : 0; 7198b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy} 7208b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy 7214fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenvoid dss_runtime_put(void) 7228b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy{ 7234fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen int r; 7248b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy 7254fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen DSSDBG("dss_runtime_put\n"); 7268b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy 7270eaf9f52e94f756147dbfe1faf1f77a02378dbf9Tomi Valkeinen r = pm_runtime_put_sync(&dss.pdev->dev); 7284fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen WARN_ON(r < 0); 7298b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy} 7308b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy 7318b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy/* DEBUGFS */ 7328b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy#if defined(CONFIG_DEBUG_FS) && defined(CONFIG_OMAP2_DSS_DEBUG_SUPPORT) 7338b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamyvoid dss_debug_dump_clocks(struct seq_file *s) 7348b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy{ 7358b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy dss_dump_clocks(s); 7368b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy dispc_dump_clocks(s); 7378b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy#ifdef CONFIG_OMAP2_DSS_DSI 7388b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy dsi_dump_clocks(s); 7398b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy#endif 7408b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy} 7418b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy#endif 7428b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy 74396c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamy/* DSS HW IP initialisation */ 74496c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamystatic int omap_dsshw_probe(struct platform_device *pdev) 74596c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamy{ 746b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen struct resource *dss_mem; 747b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen u32 rev; 74896c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamy int r; 74996c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamy 75096c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamy dss.pdev = pdev; 75196c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamy 752b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen dss_mem = platform_get_resource(dss.pdev, IORESOURCE_MEM, 0); 753b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen if (!dss_mem) { 754b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen DSSERR("can't get IORESOURCE_MEM DSS\n"); 755cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen return -EINVAL; 756b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen } 757cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen 7586e2a14d2c59f6208310eeb6b031e9d1c22b38c6aJulia Lawall dss.base = devm_ioremap(&pdev->dev, dss_mem->start, 7596e2a14d2c59f6208310eeb6b031e9d1c22b38c6aJulia Lawall resource_size(dss_mem)); 760b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen if (!dss.base) { 761b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen DSSERR("can't ioremap DSS\n"); 762cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen return -ENOMEM; 763b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen } 764b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen 7658b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy r = dss_get_clocks(); 7668b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy if (r) 767cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen return r; 7688b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy 7694fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen pm_runtime_enable(&pdev->dev); 770b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen 7714fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen r = dss_runtime_get(); 7724fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen if (r) 7734fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen goto err_runtime_get; 774b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen 775b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen /* Select DPLL */ 776b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen REG_FLD_MOD(DSS_CONTROL, 0, 0, 0); 777b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen 778b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen#ifdef CONFIG_OMAP2_DSS_VENC 779b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen REG_FLD_MOD(DSS_CONTROL, 1, 4, 4); /* venc dac demen */ 780b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen REG_FLD_MOD(DSS_CONTROL, 1, 3, 3); /* venc clock 4x enable */ 781b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen REG_FLD_MOD(DSS_CONTROL, 0, 2, 2); /* venc clock mode = normal */ 782b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen#endif 783b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen dss.dsi_clk_source[0] = OMAP_DSS_CLK_SRC_FCK; 784b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen dss.dsi_clk_source[1] = OMAP_DSS_CLK_SRC_FCK; 785b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen dss.dispc_clk_source = OMAP_DSS_CLK_SRC_FCK; 786b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen dss.lcd_clk_source[0] = OMAP_DSS_CLK_SRC_FCK; 787b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen dss.lcd_clk_source[1] = OMAP_DSS_CLK_SRC_FCK; 78896c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamy 789587b5e8269fab583e4e9d2d6bbdc77b289ac78a7Tomi Valkeinen r = dpi_init(); 790587b5e8269fab583e4e9d2d6bbdc77b289ac78a7Tomi Valkeinen if (r) { 791587b5e8269fab583e4e9d2d6bbdc77b289ac78a7Tomi Valkeinen DSSERR("Failed to initialize DPI\n"); 792587b5e8269fab583e4e9d2d6bbdc77b289ac78a7Tomi Valkeinen goto err_dpi; 793587b5e8269fab583e4e9d2d6bbdc77b289ac78a7Tomi Valkeinen } 794587b5e8269fab583e4e9d2d6bbdc77b289ac78a7Tomi Valkeinen 795587b5e8269fab583e4e9d2d6bbdc77b289ac78a7Tomi Valkeinen r = sdi_init(); 796587b5e8269fab583e4e9d2d6bbdc77b289ac78a7Tomi Valkeinen if (r) { 797587b5e8269fab583e4e9d2d6bbdc77b289ac78a7Tomi Valkeinen DSSERR("Failed to initialize SDI\n"); 798587b5e8269fab583e4e9d2d6bbdc77b289ac78a7Tomi Valkeinen goto err_sdi; 799587b5e8269fab583e4e9d2d6bbdc77b289ac78a7Tomi Valkeinen } 800587b5e8269fab583e4e9d2d6bbdc77b289ac78a7Tomi Valkeinen 801b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen rev = dss_read_reg(DSS_REVISION); 802b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen printk(KERN_INFO "OMAP DSS rev %d.%d\n", 803b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0)); 804b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen 8054fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dss_runtime_put(); 806b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen 8078b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy return 0; 808587b5e8269fab583e4e9d2d6bbdc77b289ac78a7Tomi Valkeinenerr_sdi: 809587b5e8269fab583e4e9d2d6bbdc77b289ac78a7Tomi Valkeinen dpi_exit(); 810587b5e8269fab583e4e9d2d6bbdc77b289ac78a7Tomi Valkeinenerr_dpi: 8114fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dss_runtime_put(); 8124fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenerr_runtime_get: 8134fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen pm_runtime_disable(&pdev->dev); 8148b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy dss_put_clocks(); 81596c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamy return r; 81696c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamy} 81796c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamy 81896c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamystatic int omap_dsshw_remove(struct platform_device *pdev) 81996c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamy{ 820b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen dpi_exit(); 821b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen sdi_exit(); 8228b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy 8234fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen pm_runtime_disable(&pdev->dev); 8248b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy 8258b9cb3a8f39d0864c925c5cd5c2c54cfd85ad551Senthilvadivu Guruswamy dss_put_clocks(); 826b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen 82796c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamy return 0; 82896c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamy} 82996c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamy 8304fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic int dss_runtime_suspend(struct device *dev) 8314fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen{ 8324fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dss_save_context(); 833a8081d317978416197295df22fc2ea71e4812f50Tomi Valkeinen dss_set_min_bus_tput(dev, 0); 8344fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen return 0; 8354fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen} 8364fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 8374fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic int dss_runtime_resume(struct device *dev) 8384fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen{ 839a8081d317978416197295df22fc2ea71e4812f50Tomi Valkeinen int r; 840a8081d317978416197295df22fc2ea71e4812f50Tomi Valkeinen /* 841a8081d317978416197295df22fc2ea71e4812f50Tomi Valkeinen * Set an arbitrarily high tput request to ensure OPP100. 842a8081d317978416197295df22fc2ea71e4812f50Tomi Valkeinen * What we should really do is to make a request to stay in OPP100, 843a8081d317978416197295df22fc2ea71e4812f50Tomi Valkeinen * without any tput requirements, but that is not currently possible 844a8081d317978416197295df22fc2ea71e4812f50Tomi Valkeinen * via the PM layer. 845a8081d317978416197295df22fc2ea71e4812f50Tomi Valkeinen */ 846a8081d317978416197295df22fc2ea71e4812f50Tomi Valkeinen 847a8081d317978416197295df22fc2ea71e4812f50Tomi Valkeinen r = dss_set_min_bus_tput(dev, 1000000000); 848a8081d317978416197295df22fc2ea71e4812f50Tomi Valkeinen if (r) 849a8081d317978416197295df22fc2ea71e4812f50Tomi Valkeinen return r; 850a8081d317978416197295df22fc2ea71e4812f50Tomi Valkeinen 85139020710e707a01d80ea6c9e55dad4de93bb4730Tomi Valkeinen dss_restore_context(); 8524fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen return 0; 8534fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen} 8544fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 8554fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic const struct dev_pm_ops dss_pm_ops = { 8564fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen .runtime_suspend = dss_runtime_suspend, 8574fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen .runtime_resume = dss_runtime_resume, 8584fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen}; 8594fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 86096c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamystatic struct platform_driver omap_dsshw_driver = { 86196c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamy .probe = omap_dsshw_probe, 86296c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamy .remove = omap_dsshw_remove, 86396c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamy .driver = { 86496c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamy .name = "omapdss_dss", 86596c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamy .owner = THIS_MODULE, 8664fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen .pm = &dss_pm_ops, 86796c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamy }, 86896c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamy}; 86996c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamy 87096c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamyint dss_init_platform_driver(void) 87196c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamy{ 87296c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamy return platform_driver_register(&omap_dsshw_driver); 87396c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamy} 87496c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamy 87596c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamyvoid dss_uninit_platform_driver(void) 87696c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamy{ 87704c742c3dccac296fdc52b464bd0491ffe88de23Tomi Valkeinen platform_driver_unregister(&omap_dsshw_driver); 87896c401bcb83a182a4f332f2f64ee6530ba35511aSenthilvadivu Guruswamy} 879