13de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen/* 23de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen * linux/drivers/video/omap2/dss/dsi.c 33de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen * 43de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen * Copyright (C) 2009 Nokia Corporation 53de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen * Author: Tomi Valkeinen <tomi.valkeinen@nokia.com> 63de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen * 73de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen * This program is free software; you can redistribute it and/or modify it 83de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen * under the terms of the GNU General Public License version 2 as published by 93de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen * the Free Software Foundation. 103de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen * 113de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen * This program is distributed in the hope that it will be useful, but WITHOUT 123de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 133de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for 143de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen * more details. 153de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen * 163de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen * You should have received a copy of the GNU General Public License along with 173de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen * this program. If not, see <http://www.gnu.org/licenses/>. 183de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen */ 193de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 203de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSS_SUBSYS_NAME "DSI" 213de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 223de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#include <linux/kernel.h> 233de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#include <linux/io.h> 243de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#include <linux/clk.h> 253de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#include <linux/device.h> 263de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#include <linux/err.h> 273de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#include <linux/interrupt.h> 283de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#include <linux/delay.h> 293de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#include <linux/mutex.h> 30355b200bacdb6017669cdc5bc9e7b1037aac42a2Paul Gortmaker#include <linux/module.h> 31b9eb5d7d0b9bf7c6430374333e4b9dae73bbba20Tomi Valkeinen#include <linux/semaphore.h> 323de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#include <linux/seq_file.h> 333de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#include <linux/platform_device.h> 343de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#include <linux/regulator/consumer.h> 353de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#include <linux/wait.h> 3618946f62c6cc8cf051bafca8b7fa72309e8a1067Tomi Valkeinen#include <linux/workqueue.h> 3740885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen#include <linux/sched.h> 38f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja#include <linux/slab.h> 395a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja#include <linux/debugfs.h> 404fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen#include <linux/pm_runtime.h> 413de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 42a0b38cc4d35e095f14ab0f486135f8a619ebfc14Tomi Valkeinen#include <video/omapdss.h> 437a7c48f9ab374f5fb279f31634d857adc3f0c78cArchit Taneja#include <video/mipi_display.h> 443de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#include <plat/clock.h> 453de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 463de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#include "dss.h" 47819d807c59af10cce1dcbb13539c2fb100953fcdArchit Taneja#include "dss_features.h" 483de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 493de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen/*#define VERBOSE_IRQ*/ 503de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_CATCH_MISSING_TE 513de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 523de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinenstruct dsi_reg { u16 idx; }; 533de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 543de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_REG(idx) ((const struct dsi_reg) { idx }) 553de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 563de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_SZ_REGS SZ_1K 573de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen/* DSI Protocol Engine */ 583de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 593de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_REVISION DSI_REG(0x0000) 603de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_SYSCONFIG DSI_REG(0x0010) 613de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_SYSSTATUS DSI_REG(0x0014) 623de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_IRQSTATUS DSI_REG(0x0018) 633de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_IRQENABLE DSI_REG(0x001C) 643de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_CTRL DSI_REG(0x0040) 6575d7247c07d27d046323504e2dbca5b3e94fbeceArchit Taneja#define DSI_GNQ DSI_REG(0x0044) 663de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_COMPLEXIO_CFG1 DSI_REG(0x0048) 673de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_COMPLEXIO_IRQ_STATUS DSI_REG(0x004C) 683de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_COMPLEXIO_IRQ_ENABLE DSI_REG(0x0050) 693de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_CLK_CTRL DSI_REG(0x0054) 703de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_TIMING1 DSI_REG(0x0058) 713de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_TIMING2 DSI_REG(0x005C) 723de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_VM_TIMING1 DSI_REG(0x0060) 733de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_VM_TIMING2 DSI_REG(0x0064) 743de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_VM_TIMING3 DSI_REG(0x0068) 753de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_CLK_TIMING DSI_REG(0x006C) 763de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_TX_FIFO_VC_SIZE DSI_REG(0x0070) 773de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_RX_FIFO_VC_SIZE DSI_REG(0x0074) 783de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_COMPLEXIO_CFG2 DSI_REG(0x0078) 793de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_RX_FIFO_VC_FULLNESS DSI_REG(0x007C) 803de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_VM_TIMING4 DSI_REG(0x0080) 813de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_TX_FIFO_VC_EMPTINESS DSI_REG(0x0084) 823de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_VM_TIMING5 DSI_REG(0x0088) 833de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_VM_TIMING6 DSI_REG(0x008C) 843de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_VM_TIMING7 DSI_REG(0x0090) 853de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_STOPCLK_TIMING DSI_REG(0x0094) 863de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_VC_CTRL(n) DSI_REG(0x0100 + (n * 0x20)) 873de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_VC_TE(n) DSI_REG(0x0104 + (n * 0x20)) 883de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_VC_LONG_PACKET_HEADER(n) DSI_REG(0x0108 + (n * 0x20)) 893de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_VC_LONG_PACKET_PAYLOAD(n) DSI_REG(0x010C + (n * 0x20)) 903de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_VC_SHORT_PACKET_HEADER(n) DSI_REG(0x0110 + (n * 0x20)) 913de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_VC_IRQSTATUS(n) DSI_REG(0x0118 + (n * 0x20)) 923de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_VC_IRQENABLE(n) DSI_REG(0x011C + (n * 0x20)) 933de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 943de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen/* DSIPHY_SCP */ 953de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 963de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_DSIPHY_CFG0 DSI_REG(0x200 + 0x0000) 973de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_DSIPHY_CFG1 DSI_REG(0x200 + 0x0004) 983de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_DSIPHY_CFG2 DSI_REG(0x200 + 0x0008) 993de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_DSIPHY_CFG5 DSI_REG(0x200 + 0x0014) 1000a0ee46b1ae05862cb05ec43caffc01c5259c4ccTomi Valkeinen#define DSI_DSIPHY_CFG10 DSI_REG(0x200 + 0x0028) 1013de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1023de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen/* DSI_PLL_CTRL_SCP */ 1033de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1043de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_PLL_CONTROL DSI_REG(0x300 + 0x0000) 1053de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_PLL_STATUS DSI_REG(0x300 + 0x0004) 1063de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_PLL_GO DSI_REG(0x300 + 0x0008) 1073de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_PLL_CONFIGURATION1 DSI_REG(0x300 + 0x000C) 1083de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_PLL_CONFIGURATION2 DSI_REG(0x300 + 0x0010) 1093de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 110a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja#define REG_GET(dsidev, idx, start, end) \ 111a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja FLD_GET(dsi_read_reg(dsidev, idx), start, end) 1123de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 113a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja#define REG_FLD_MOD(dsidev, idx, val, start, end) \ 114a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_write_reg(dsidev, idx, FLD_MOD(dsi_read_reg(dsidev, idx), val, start, end)) 1153de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1163de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen/* Global interrupts */ 1173de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_IRQ_VC0 (1 << 0) 1183de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_IRQ_VC1 (1 << 1) 1193de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_IRQ_VC2 (1 << 2) 1203de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_IRQ_VC3 (1 << 3) 1213de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_IRQ_WAKEUP (1 << 4) 1223de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_IRQ_RESYNC (1 << 5) 1233de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_IRQ_PLL_LOCK (1 << 7) 1243de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_IRQ_PLL_UNLOCK (1 << 8) 1253de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_IRQ_PLL_RECALL (1 << 9) 1263de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_IRQ_COMPLEXIO_ERR (1 << 10) 1273de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_IRQ_HS_TX_TIMEOUT (1 << 14) 1283de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_IRQ_LP_RX_TIMEOUT (1 << 15) 1293de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_IRQ_TE_TRIGGER (1 << 16) 1303de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_IRQ_ACK_TRIGGER (1 << 17) 1313de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_IRQ_SYNC_LOST (1 << 18) 1323de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_IRQ_LDO_POWER_GOOD (1 << 19) 1333de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_IRQ_TA_TIMEOUT (1 << 20) 1343de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_IRQ_ERROR_MASK \ 1353de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen (DSI_IRQ_HS_TX_TIMEOUT | DSI_IRQ_LP_RX_TIMEOUT | DSI_IRQ_SYNC_LOST | \ 1368af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja DSI_IRQ_TA_TIMEOUT | DSI_IRQ_SYNC_LOST) 1373de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_IRQ_CHANNEL_MASK 0xf 1383de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1393de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen/* Virtual channel interrupts */ 1403de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_VC_IRQ_CS (1 << 0) 1413de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_VC_IRQ_ECC_CORR (1 << 1) 1423de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_VC_IRQ_PACKET_SENT (1 << 2) 1433de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_VC_IRQ_FIFO_TX_OVF (1 << 3) 1443de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_VC_IRQ_FIFO_RX_OVF (1 << 4) 1453de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_VC_IRQ_BTA (1 << 5) 1463de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_VC_IRQ_ECC_NO_CORR (1 << 6) 1473de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_VC_IRQ_FIFO_TX_UDF (1 << 7) 1483de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_VC_IRQ_PP_BUSY_CHANGE (1 << 8) 1493de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_VC_IRQ_ERROR_MASK \ 1503de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen (DSI_VC_IRQ_CS | DSI_VC_IRQ_ECC_CORR | DSI_VC_IRQ_FIFO_TX_OVF | \ 1513de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSI_VC_IRQ_FIFO_RX_OVF | DSI_VC_IRQ_ECC_NO_CORR | \ 1523de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSI_VC_IRQ_FIFO_TX_UDF) 1533de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1543de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen/* ComplexIO interrupts */ 1553de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_CIO_IRQ_ERRSYNCESC1 (1 << 0) 1563de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_CIO_IRQ_ERRSYNCESC2 (1 << 1) 1573de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_CIO_IRQ_ERRSYNCESC3 (1 << 2) 1586705615e92b6d44c8e09703282bee7d7275bb74fTomi Valkeinen#define DSI_CIO_IRQ_ERRSYNCESC4 (1 << 3) 1596705615e92b6d44c8e09703282bee7d7275bb74fTomi Valkeinen#define DSI_CIO_IRQ_ERRSYNCESC5 (1 << 4) 1603de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_CIO_IRQ_ERRESC1 (1 << 5) 1613de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_CIO_IRQ_ERRESC2 (1 << 6) 1623de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_CIO_IRQ_ERRESC3 (1 << 7) 1636705615e92b6d44c8e09703282bee7d7275bb74fTomi Valkeinen#define DSI_CIO_IRQ_ERRESC4 (1 << 8) 1646705615e92b6d44c8e09703282bee7d7275bb74fTomi Valkeinen#define DSI_CIO_IRQ_ERRESC5 (1 << 9) 1653de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_CIO_IRQ_ERRCONTROL1 (1 << 10) 1663de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_CIO_IRQ_ERRCONTROL2 (1 << 11) 1673de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_CIO_IRQ_ERRCONTROL3 (1 << 12) 1686705615e92b6d44c8e09703282bee7d7275bb74fTomi Valkeinen#define DSI_CIO_IRQ_ERRCONTROL4 (1 << 13) 1696705615e92b6d44c8e09703282bee7d7275bb74fTomi Valkeinen#define DSI_CIO_IRQ_ERRCONTROL5 (1 << 14) 1703de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_CIO_IRQ_STATEULPS1 (1 << 15) 1713de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_CIO_IRQ_STATEULPS2 (1 << 16) 1723de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_CIO_IRQ_STATEULPS3 (1 << 17) 1736705615e92b6d44c8e09703282bee7d7275bb74fTomi Valkeinen#define DSI_CIO_IRQ_STATEULPS4 (1 << 18) 1746705615e92b6d44c8e09703282bee7d7275bb74fTomi Valkeinen#define DSI_CIO_IRQ_STATEULPS5 (1 << 19) 1753de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_CIO_IRQ_ERRCONTENTIONLP0_1 (1 << 20) 1763de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_CIO_IRQ_ERRCONTENTIONLP1_1 (1 << 21) 1773de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_CIO_IRQ_ERRCONTENTIONLP0_2 (1 << 22) 1783de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_CIO_IRQ_ERRCONTENTIONLP1_2 (1 << 23) 1793de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_CIO_IRQ_ERRCONTENTIONLP0_3 (1 << 24) 1803de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_CIO_IRQ_ERRCONTENTIONLP1_3 (1 << 25) 1816705615e92b6d44c8e09703282bee7d7275bb74fTomi Valkeinen#define DSI_CIO_IRQ_ERRCONTENTIONLP0_4 (1 << 26) 1826705615e92b6d44c8e09703282bee7d7275bb74fTomi Valkeinen#define DSI_CIO_IRQ_ERRCONTENTIONLP1_4 (1 << 27) 1836705615e92b6d44c8e09703282bee7d7275bb74fTomi Valkeinen#define DSI_CIO_IRQ_ERRCONTENTIONLP0_5 (1 << 28) 1846705615e92b6d44c8e09703282bee7d7275bb74fTomi Valkeinen#define DSI_CIO_IRQ_ERRCONTENTIONLP1_5 (1 << 29) 1853de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_CIO_IRQ_ULPSACTIVENOT_ALL0 (1 << 30) 1863de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define DSI_CIO_IRQ_ULPSACTIVENOT_ALL1 (1 << 31) 187bbecb50b5f609e0291cce83e10b5500cc8d688c6Tomi Valkeinen#define DSI_CIO_IRQ_ERROR_MASK \ 188bbecb50b5f609e0291cce83e10b5500cc8d688c6Tomi Valkeinen (DSI_CIO_IRQ_ERRSYNCESC1 | DSI_CIO_IRQ_ERRSYNCESC2 | \ 1896705615e92b6d44c8e09703282bee7d7275bb74fTomi Valkeinen DSI_CIO_IRQ_ERRSYNCESC3 | DSI_CIO_IRQ_ERRSYNCESC4 | \ 1906705615e92b6d44c8e09703282bee7d7275bb74fTomi Valkeinen DSI_CIO_IRQ_ERRSYNCESC5 | \ 1916705615e92b6d44c8e09703282bee7d7275bb74fTomi Valkeinen DSI_CIO_IRQ_ERRESC1 | DSI_CIO_IRQ_ERRESC2 | \ 1926705615e92b6d44c8e09703282bee7d7275bb74fTomi Valkeinen DSI_CIO_IRQ_ERRESC3 | DSI_CIO_IRQ_ERRESC4 | \ 1936705615e92b6d44c8e09703282bee7d7275bb74fTomi Valkeinen DSI_CIO_IRQ_ERRESC5 | \ 1946705615e92b6d44c8e09703282bee7d7275bb74fTomi Valkeinen DSI_CIO_IRQ_ERRCONTROL1 | DSI_CIO_IRQ_ERRCONTROL2 | \ 1956705615e92b6d44c8e09703282bee7d7275bb74fTomi Valkeinen DSI_CIO_IRQ_ERRCONTROL3 | DSI_CIO_IRQ_ERRCONTROL4 | \ 1966705615e92b6d44c8e09703282bee7d7275bb74fTomi Valkeinen DSI_CIO_IRQ_ERRCONTROL5 | \ 197bbecb50b5f609e0291cce83e10b5500cc8d688c6Tomi Valkeinen DSI_CIO_IRQ_ERRCONTENTIONLP0_1 | DSI_CIO_IRQ_ERRCONTENTIONLP1_1 | \ 198bbecb50b5f609e0291cce83e10b5500cc8d688c6Tomi Valkeinen DSI_CIO_IRQ_ERRCONTENTIONLP0_2 | DSI_CIO_IRQ_ERRCONTENTIONLP1_2 | \ 1996705615e92b6d44c8e09703282bee7d7275bb74fTomi Valkeinen DSI_CIO_IRQ_ERRCONTENTIONLP0_3 | DSI_CIO_IRQ_ERRCONTENTIONLP1_3 | \ 2006705615e92b6d44c8e09703282bee7d7275bb74fTomi Valkeinen DSI_CIO_IRQ_ERRCONTENTIONLP0_4 | DSI_CIO_IRQ_ERRCONTENTIONLP1_4 | \ 2016705615e92b6d44c8e09703282bee7d7275bb74fTomi Valkeinen DSI_CIO_IRQ_ERRCONTENTIONLP0_5 | DSI_CIO_IRQ_ERRCONTENTIONLP1_5) 2023de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2034ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinentypedef void (*omap_dsi_isr_t) (void *arg, u32 mask); 2044ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 2054ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen#define DSI_MAX_NR_ISRS 2 206739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen#define DSI_MAX_NR_LANES 5 207739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen 208739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinenenum dsi_lane_function { 209739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen DSI_LANE_UNUSED = 0, 210739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen DSI_LANE_CLK, 211739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen DSI_LANE_DATA1, 212739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen DSI_LANE_DATA2, 213739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen DSI_LANE_DATA3, 214739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen DSI_LANE_DATA4, 215739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen}; 216739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen 217739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinenstruct dsi_lane_config { 218739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen enum dsi_lane_function function; 219739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen u8 polarity; 220739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen}; 2214ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 2224ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinenstruct dsi_isr_data { 2234ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen omap_dsi_isr_t isr; 2244ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen void *arg; 2254ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen u32 mask; 2264ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen}; 2274ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 2283de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinenenum fifo_size { 2293de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSI_FIFO_SIZE_0 = 0, 2303de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSI_FIFO_SIZE_32 = 1, 2313de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSI_FIFO_SIZE_64 = 2, 2323de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSI_FIFO_SIZE_96 = 3, 2333de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSI_FIFO_SIZE_128 = 4, 2343de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen}; 2353de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 236d604914484ccaaf33361558c9eb2abb441cf9d25Archit Tanejaenum dsi_vc_source { 237d604914484ccaaf33361558c9eb2abb441cf9d25Archit Taneja DSI_VC_SOURCE_L4 = 0, 238d604914484ccaaf33361558c9eb2abb441cf9d25Archit Taneja DSI_VC_SOURCE_VP, 2393de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen}; 2403de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 241dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinenstruct dsi_irq_stats { 242dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen unsigned long last_reset; 243dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen unsigned irq_count; 244dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen unsigned dsi_irqs[32]; 245dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen unsigned vc_irqs[4][32]; 246dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen unsigned cio_irqs[32]; 247dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen}; 248dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 2494ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinenstruct dsi_isr_tables { 2504ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen struct dsi_isr_data isr_table[DSI_MAX_NR_ISRS]; 2514ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen struct dsi_isr_data isr_table_vc[4][DSI_MAX_NR_ISRS]; 2524ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen struct dsi_isr_data isr_table_cio[DSI_MAX_NR_ISRS]; 2534ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen}; 2544ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 255f1da39d9ce8490c5652768180454a816eb043b48Archit Tanejastruct dsi_data { 256c8aac01b7bd1109795586db11ea7f12ab1e2d163Senthilvadivu Guruswamy struct platform_device *pdev; 2573de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen void __iomem *base; 2584fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 259affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja int irq; 2603de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2614fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen struct clk *dss_clk; 2624fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen struct clk *sys_clk; 2634fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 2645bc416cba15f43c799fc02727c6d6887f3e35a4eTomi Valkeinen int (*enable_pads)(int dsi_id, unsigned lane_mask); 2655bc416cba15f43c799fc02727c6d6887f3e35a4eTomi Valkeinen void (*disable_pads)(int dsi_id, unsigned lane_mask); 266d1f5857e4bc9b2620fb3e84b1dbaa0ac11b831b4Tomi Valkeinen 2673de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen struct dsi_clock_info current_cinfo; 2683de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2692a89dc15331983621b772240ebef9dea2cbe5322Tomi Valkeinen bool vdds_dsi_enabled; 2703de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen struct regulator *vdds_dsi_reg; 2713de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2723de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen struct { 273d604914484ccaaf33361558c9eb2abb441cf9d25Archit Taneja enum dsi_vc_source source; 2743de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen struct omap_dss_device *dssdev; 2753de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen enum fifo_size fifo_size; 2765ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja int vc_id; 2773de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } vc[4]; 2783de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2793de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen struct mutex lock; 280b9eb5d7d0b9bf7c6430374333e4b9dae73bbba20Tomi Valkeinen struct semaphore bus_lock; 2813de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2823de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen unsigned pll_locked; 2833de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2844ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen spinlock_t irq_lock; 2854ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen struct dsi_isr_tables isr_tables; 2864ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen /* space for a copy used by the interrupt handler */ 2874ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen struct dsi_isr_tables isr_tables_copy; 2884ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 28918946f62c6cc8cf051bafca8b7fa72309e8a1067Tomi Valkeinen int update_channel; 2905476e74a03f4be972708162050c8ac7fe150449fTomi Valkeinen#ifdef DEBUG 2915476e74a03f4be972708162050c8ac7fe150449fTomi Valkeinen unsigned update_bytes; 2925476e74a03f4be972708162050c8ac7fe150449fTomi Valkeinen#endif 2933de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2943de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen bool te_enabled; 29540885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen bool ulps_enabled; 2963de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 29718946f62c6cc8cf051bafca8b7fa72309e8a1067Tomi Valkeinen void (*framedone_callback)(int, void *); 29818946f62c6cc8cf051bafca8b7fa72309e8a1067Tomi Valkeinen void *framedone_data; 29918946f62c6cc8cf051bafca8b7fa72309e8a1067Tomi Valkeinen 30018946f62c6cc8cf051bafca8b7fa72309e8a1067Tomi Valkeinen struct delayed_work framedone_timeout_work; 30118946f62c6cc8cf051bafca8b7fa72309e8a1067Tomi Valkeinen 3023de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#ifdef DSI_CATCH_MISSING_TE 3033de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen struct timer_list te_timer; 3043de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#endif 3053de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3063de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen unsigned long cache_req_pck; 3073de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen unsigned long cache_clk_freq; 3083de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen struct dsi_clock_info cache_cinfo; 3093de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3103de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u32 errors; 3113de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen spinlock_t errors_lock; 3123de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#ifdef DEBUG 3133de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen ktime_t perf_setup_time; 3143de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen ktime_t perf_start_time; 3153de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#endif 3163de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen int debug_read; 3173de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen int debug_write; 318dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 319dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS 320dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen spinlock_t irq_stats_lock; 321dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen struct dsi_irq_stats irq_stats; 322dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#endif 32349641116392ad7522fa0efad53f7ed63f811bd88Archit Taneja /* DSI PLL Parameter Ranges */ 32449641116392ad7522fa0efad53f7ed63f811bd88Archit Taneja unsigned long regm_max, regn_max; 32549641116392ad7522fa0efad53f7ed63f811bd88Archit Taneja unsigned long regm_dispc_max, regm_dsi_max; 32649641116392ad7522fa0efad53f7ed63f811bd88Archit Taneja unsigned long fint_min, fint_max; 32749641116392ad7522fa0efad53f7ed63f811bd88Archit Taneja unsigned long lpdiv_max; 32824c1ae4191e911caa08b31079d61ff4db319a101Tomi Valkeinen 329d982085050e67da24a57ec04eb3701eb4805118aTomi Valkeinen unsigned num_lanes_supported; 33075d7247c07d27d046323504e2dbca5b3e94fbeceArchit Taneja 331739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen struct dsi_lane_config lanes[DSI_MAX_NR_LANES]; 332739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen unsigned num_lanes_used; 33375d7247c07d27d046323504e2dbca5b3e94fbeceArchit Taneja 33424c1ae4191e911caa08b31079d61ff4db319a101Tomi Valkeinen unsigned scp_clk_refcount; 335f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja}; 3363de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3372e868dbe1d24a908fcb4dee0733500fd0aab0bceArchit Tanejastruct dsi_packet_sent_handler_data { 3382e868dbe1d24a908fcb4dee0733500fd0aab0bceArchit Taneja struct platform_device *dsidev; 3392e868dbe1d24a908fcb4dee0733500fd0aab0bceArchit Taneja struct completion *completion; 3402e868dbe1d24a908fcb4dee0733500fd0aab0bceArchit Taneja}; 3412e868dbe1d24a908fcb4dee0733500fd0aab0bceArchit Taneja 342a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic struct platform_device *dsi_pdev_map[MAX_NUM_DSI]; 343a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja 3443de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#ifdef DEBUG 34590ab5ee94171b3e28de6bb42ee30b527014e0be7Rusty Russellstatic bool dsi_perf; 34690ab5ee94171b3e28de6bb42ee30b527014e0be7Rusty Russellmodule_param(dsi_perf, bool, 0644); 3473de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#endif 3483de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 349f1da39d9ce8490c5652768180454a816eb043b48Archit Tanejastatic inline struct dsi_data *dsi_get_dsidrv_data(struct platform_device *dsidev) 350f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja{ 351f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja return dev_get_drvdata(&dsidev->dev); 352f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja} 353f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 354a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic inline struct platform_device *dsi_get_dsidev_from_dssdev(struct omap_dss_device *dssdev) 355a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja{ 356a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja return dsi_pdev_map[dssdev->phy.dsi.module]; 357a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja} 358a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja 359a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastruct platform_device *dsi_get_dsidev_from_id(int module) 360a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja{ 361a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja return dsi_pdev_map[module]; 362a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja} 363a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja 3647c68dd96d5a5eefe3ff6d9b94fc98fd9378aff1fTomi Valkeinenstatic inline int dsi_get_dsidev_id(struct platform_device *dsidev) 365f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja{ 3667c68dd96d5a5eefe3ff6d9b94fc98fd9378aff1fTomi Valkeinen return dsidev->id; 367f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja} 368f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 369a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic inline void dsi_write_reg(struct platform_device *dsidev, 370a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja const struct dsi_reg idx, u32 val) 3713de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 372f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 373f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 374f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja __raw_writel(val, dsi->base + idx.idx); 3753de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 3763de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 377a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic inline u32 dsi_read_reg(struct platform_device *dsidev, 378a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja const struct dsi_reg idx) 3793de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 380f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 381f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 382f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja return __raw_readl(dsi->base + idx.idx); 3833de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 3843de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3851ffefe755c2681752a10ae50b2b17e70147bb194Archit Tanejavoid dsi_bus_lock(struct omap_dss_device *dssdev) 3863de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 387f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 388f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 389f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 390f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja down(&dsi->bus_lock); 3913de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 3923de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi ValkeinenEXPORT_SYMBOL(dsi_bus_lock); 3933de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3941ffefe755c2681752a10ae50b2b17e70147bb194Archit Tanejavoid dsi_bus_unlock(struct omap_dss_device *dssdev) 3953de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 396f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 397f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 398f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 399f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja up(&dsi->bus_lock); 4003de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 4013de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi ValkeinenEXPORT_SYMBOL(dsi_bus_unlock); 4023de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 403a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic bool dsi_bus_is_locked(struct platform_device *dsidev) 4044f76502374ff91bc80a48a32cabb1009087a3b9dTomi Valkeinen{ 405f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 406f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 407f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja return dsi->bus_lock.count == 0; 4084f76502374ff91bc80a48a32cabb1009087a3b9dTomi Valkeinen} 4094f76502374ff91bc80a48a32cabb1009087a3b9dTomi Valkeinen 410f36a06e702ef804a99ce3a286514d84610a74db5Tomi Valkeinenstatic void dsi_completion_handler(void *data, u32 mask) 411f36a06e702ef804a99ce3a286514d84610a74db5Tomi Valkeinen{ 412f36a06e702ef804a99ce3a286514d84610a74db5Tomi Valkeinen complete((struct completion *)data); 413f36a06e702ef804a99ce3a286514d84610a74db5Tomi Valkeinen} 414f36a06e702ef804a99ce3a286514d84610a74db5Tomi Valkeinen 415a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic inline int wait_for_bit_change(struct platform_device *dsidev, 416a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja const struct dsi_reg idx, int bitnum, int value) 4173de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 4183b98409eb7508ce534243312c3a9ac8543c06808Tomi Valkeinen unsigned long timeout; 4193b98409eb7508ce534243312c3a9ac8543c06808Tomi Valkeinen ktime_t wait; 4203b98409eb7508ce534243312c3a9ac8543c06808Tomi Valkeinen int t; 4213de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4223b98409eb7508ce534243312c3a9ac8543c06808Tomi Valkeinen /* first busyloop to see if the bit changes right away */ 4233b98409eb7508ce534243312c3a9ac8543c06808Tomi Valkeinen t = 100; 4243b98409eb7508ce534243312c3a9ac8543c06808Tomi Valkeinen while (t-- > 0) { 4253b98409eb7508ce534243312c3a9ac8543c06808Tomi Valkeinen if (REG_GET(dsidev, idx, bitnum, bitnum) == value) 4263b98409eb7508ce534243312c3a9ac8543c06808Tomi Valkeinen return value; 4273de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 4283de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4293b98409eb7508ce534243312c3a9ac8543c06808Tomi Valkeinen /* then loop for 500ms, sleeping for 1ms in between */ 4303b98409eb7508ce534243312c3a9ac8543c06808Tomi Valkeinen timeout = jiffies + msecs_to_jiffies(500); 4313b98409eb7508ce534243312c3a9ac8543c06808Tomi Valkeinen while (time_before(jiffies, timeout)) { 4323b98409eb7508ce534243312c3a9ac8543c06808Tomi Valkeinen if (REG_GET(dsidev, idx, bitnum, bitnum) == value) 4333b98409eb7508ce534243312c3a9ac8543c06808Tomi Valkeinen return value; 4343de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4353b98409eb7508ce534243312c3a9ac8543c06808Tomi Valkeinen wait = ns_to_ktime(1000 * 1000); 4363b98409eb7508ce534243312c3a9ac8543c06808Tomi Valkeinen set_current_state(TASK_UNINTERRUPTIBLE); 4373b98409eb7508ce534243312c3a9ac8543c06808Tomi Valkeinen schedule_hrtimeout(&wait, HRTIMER_MODE_REL); 4383de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 4393de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4403b98409eb7508ce534243312c3a9ac8543c06808Tomi Valkeinen return !value; 4413de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 4423de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 443a3b3cc2b883aac18a3388a405db809a99d66e3cfArchit Tanejau8 dsi_get_pixel_size(enum omap_dss_dsi_pixel_format fmt) 444a3b3cc2b883aac18a3388a405db809a99d66e3cfArchit Taneja{ 445a3b3cc2b883aac18a3388a405db809a99d66e3cfArchit Taneja switch (fmt) { 446a3b3cc2b883aac18a3388a405db809a99d66e3cfArchit Taneja case OMAP_DSS_DSI_FMT_RGB888: 447a3b3cc2b883aac18a3388a405db809a99d66e3cfArchit Taneja case OMAP_DSS_DSI_FMT_RGB666: 448a3b3cc2b883aac18a3388a405db809a99d66e3cfArchit Taneja return 24; 449a3b3cc2b883aac18a3388a405db809a99d66e3cfArchit Taneja case OMAP_DSS_DSI_FMT_RGB666_PACKED: 450a3b3cc2b883aac18a3388a405db809a99d66e3cfArchit Taneja return 18; 451a3b3cc2b883aac18a3388a405db809a99d66e3cfArchit Taneja case OMAP_DSS_DSI_FMT_RGB565: 452a3b3cc2b883aac18a3388a405db809a99d66e3cfArchit Taneja return 16; 453a3b3cc2b883aac18a3388a405db809a99d66e3cfArchit Taneja default: 454a3b3cc2b883aac18a3388a405db809a99d66e3cfArchit Taneja BUG(); 455a3b3cc2b883aac18a3388a405db809a99d66e3cfArchit Taneja } 456a3b3cc2b883aac18a3388a405db809a99d66e3cfArchit Taneja} 457a3b3cc2b883aac18a3388a405db809a99d66e3cfArchit Taneja 4583de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#ifdef DEBUG 459a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic void dsi_perf_mark_setup(struct platform_device *dsidev) 4603de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 461f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 462f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->perf_setup_time = ktime_get(); 4633de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 4643de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 465a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic void dsi_perf_mark_start(struct platform_device *dsidev) 4663de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 467f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 468f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->perf_start_time = ktime_get(); 4693de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 4703de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 471a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic void dsi_perf_show(struct platform_device *dsidev, const char *name) 4723de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 473f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 4743de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen ktime_t t, setup_time, trans_time; 4753de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u32 total_bytes; 4763de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u32 setup_us, trans_us, total_us; 4773de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4783de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (!dsi_perf) 4793de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return; 4803de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4813de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen t = ktime_get(); 4823de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 483f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja setup_time = ktime_sub(dsi->perf_start_time, dsi->perf_setup_time); 4843de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen setup_us = (u32)ktime_to_us(setup_time); 4853de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (setup_us == 0) 4863de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen setup_us = 1; 4873de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 488f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja trans_time = ktime_sub(t, dsi->perf_start_time); 4893de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen trans_us = (u32)ktime_to_us(trans_time); 4903de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (trans_us == 0) 4913de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen trans_us = 1; 4923de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4933de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen total_us = setup_us + trans_us; 4943de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4955476e74a03f4be972708162050c8ac7fe150449fTomi Valkeinen total_bytes = dsi->update_bytes; 4963de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4971bbb275e261eb204795d4a48b3e485f2ad3d627cTomi Valkeinen printk(KERN_INFO "DSI(%s): %u us + %u us = %u us (%uHz), " 4981bbb275e261eb204795d4a48b3e485f2ad3d627cTomi Valkeinen "%u bytes, %u kbytes/sec\n", 4991bbb275e261eb204795d4a48b3e485f2ad3d627cTomi Valkeinen name, 5001bbb275e261eb204795d4a48b3e485f2ad3d627cTomi Valkeinen setup_us, 5011bbb275e261eb204795d4a48b3e485f2ad3d627cTomi Valkeinen trans_us, 5021bbb275e261eb204795d4a48b3e485f2ad3d627cTomi Valkeinen total_us, 5031bbb275e261eb204795d4a48b3e485f2ad3d627cTomi Valkeinen 1000*1000 / total_us, 5041bbb275e261eb204795d4a48b3e485f2ad3d627cTomi Valkeinen total_bytes, 5051bbb275e261eb204795d4a48b3e485f2ad3d627cTomi Valkeinen total_bytes * 1000 / total_us); 5063de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 5073de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#else 5084a9a5e390cb57f12de77b94b07dccf14752157adTomi Valkeinenstatic inline void dsi_perf_mark_setup(struct platform_device *dsidev) 5094a9a5e390cb57f12de77b94b07dccf14752157adTomi Valkeinen{ 5104a9a5e390cb57f12de77b94b07dccf14752157adTomi Valkeinen} 5114a9a5e390cb57f12de77b94b07dccf14752157adTomi Valkeinen 5124a9a5e390cb57f12de77b94b07dccf14752157adTomi Valkeinenstatic inline void dsi_perf_mark_start(struct platform_device *dsidev) 5134a9a5e390cb57f12de77b94b07dccf14752157adTomi Valkeinen{ 5144a9a5e390cb57f12de77b94b07dccf14752157adTomi Valkeinen} 5154a9a5e390cb57f12de77b94b07dccf14752157adTomi Valkeinen 5164a9a5e390cb57f12de77b94b07dccf14752157adTomi Valkeinenstatic inline void dsi_perf_show(struct platform_device *dsidev, 5174a9a5e390cb57f12de77b94b07dccf14752157adTomi Valkeinen const char *name) 5184a9a5e390cb57f12de77b94b07dccf14752157adTomi Valkeinen{ 5194a9a5e390cb57f12de77b94b07dccf14752157adTomi Valkeinen} 5203de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#endif 5213de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 5223de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinenstatic void print_irq_status(u32 status) 5233de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 524d80d499ed926e70b429d309360f5910d5ad54788Tomi Valkeinen if (status == 0) 525d80d499ed926e70b429d309360f5910d5ad54788Tomi Valkeinen return; 526d80d499ed926e70b429d309360f5910d5ad54788Tomi Valkeinen 5273de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#ifndef VERBOSE_IRQ 5283de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if ((status & ~DSI_IRQ_CHANNEL_MASK) == 0) 5293de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return; 5303de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#endif 5313de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen printk(KERN_DEBUG "DSI IRQ: 0x%x: ", status); 5323de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 5333de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define PIS(x) \ 5343de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (status & DSI_IRQ_##x) \ 5353de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen printk(#x " "); 5363de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#ifdef VERBOSE_IRQ 5373de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(VC0); 5383de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(VC1); 5393de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(VC2); 5403de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(VC3); 5413de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#endif 5423de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(WAKEUP); 5433de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(RESYNC); 5443de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(PLL_LOCK); 5453de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(PLL_UNLOCK); 5463de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(PLL_RECALL); 5473de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(COMPLEXIO_ERR); 5483de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(HS_TX_TIMEOUT); 5493de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(LP_RX_TIMEOUT); 5503de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(TE_TRIGGER); 5513de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(ACK_TRIGGER); 5523de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(SYNC_LOST); 5533de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(LDO_POWER_GOOD); 5543de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(TA_TIMEOUT); 5553de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#undef PIS 5563de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 5573de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen printk("\n"); 5583de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 5593de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 5603de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinenstatic void print_irq_status_vc(int channel, u32 status) 5613de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 562d80d499ed926e70b429d309360f5910d5ad54788Tomi Valkeinen if (status == 0) 563d80d499ed926e70b429d309360f5910d5ad54788Tomi Valkeinen return; 564d80d499ed926e70b429d309360f5910d5ad54788Tomi Valkeinen 5653de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#ifndef VERBOSE_IRQ 5663de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if ((status & ~DSI_VC_IRQ_PACKET_SENT) == 0) 5673de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return; 5683de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#endif 5693de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen printk(KERN_DEBUG "DSI VC(%d) IRQ 0x%x: ", channel, status); 5703de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 5713de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define PIS(x) \ 5723de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (status & DSI_VC_IRQ_##x) \ 5733de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen printk(#x " "); 5743de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(CS); 5753de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(ECC_CORR); 5763de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#ifdef VERBOSE_IRQ 5773de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(PACKET_SENT); 5783de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#endif 5793de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(FIFO_TX_OVF); 5803de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(FIFO_RX_OVF); 5813de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(BTA); 5823de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(ECC_NO_CORR); 5833de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(FIFO_TX_UDF); 5843de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(PP_BUSY_CHANGE); 5853de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#undef PIS 5863de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen printk("\n"); 5873de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 5883de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 5893de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinenstatic void print_irq_status_cio(u32 status) 5903de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 591d80d499ed926e70b429d309360f5910d5ad54788Tomi Valkeinen if (status == 0) 592d80d499ed926e70b429d309360f5910d5ad54788Tomi Valkeinen return; 593d80d499ed926e70b429d309360f5910d5ad54788Tomi Valkeinen 5943de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen printk(KERN_DEBUG "DSI CIO IRQ 0x%x: ", status); 5953de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 5963de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#define PIS(x) \ 5973de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (status & DSI_CIO_IRQ_##x) \ 5983de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen printk(#x " "); 5993de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(ERRSYNCESC1); 6003de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(ERRSYNCESC2); 6013de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(ERRSYNCESC3); 6023de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(ERRESC1); 6033de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(ERRESC2); 6043de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(ERRESC3); 6053de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(ERRCONTROL1); 6063de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(ERRCONTROL2); 6073de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(ERRCONTROL3); 6083de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(STATEULPS1); 6093de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(STATEULPS2); 6103de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(STATEULPS3); 6113de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(ERRCONTENTIONLP0_1); 6123de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(ERRCONTENTIONLP1_1); 6133de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(ERRCONTENTIONLP0_2); 6143de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(ERRCONTENTIONLP1_2); 6153de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(ERRCONTENTIONLP0_3); 6163de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(ERRCONTENTIONLP1_3); 6173de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(ULPSACTIVENOT_ALL0); 6183de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen PIS(ULPSACTIVENOT_ALL1); 6193de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#undef PIS 6203de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 6213de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen printk("\n"); 6223de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 6233de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 62469b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen#ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS 625a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic void dsi_collect_irq_stats(struct platform_device *dsidev, u32 irqstatus, 626a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja u32 *vcstatus, u32 ciostatus) 6273de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 628f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 6293de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen int i; 6303de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 631f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja spin_lock(&dsi->irq_stats_lock); 63269b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen 633f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->irq_stats.irq_count++; 634f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dss_collect_irq_stats(irqstatus, dsi->irq_stats.dsi_irqs); 63569b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen 63669b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen for (i = 0; i < 4; ++i) 637f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dss_collect_irq_stats(vcstatus[i], dsi->irq_stats.vc_irqs[i]); 63869b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen 639f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dss_collect_irq_stats(ciostatus, dsi->irq_stats.cio_irqs); 64069b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen 641f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja spin_unlock(&dsi->irq_stats_lock); 64269b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen} 64369b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen#else 644a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja#define dsi_collect_irq_stats(dsidev, irqstatus, vcstatus, ciostatus) 645dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#endif 646dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 64769b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinenstatic int debug_irq; 64869b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen 649a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic void dsi_handle_irq_errors(struct platform_device *dsidev, u32 irqstatus, 650a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja u32 *vcstatus, u32 ciostatus) 65169b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen{ 652f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 65369b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen int i; 65469b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen 6553de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (irqstatus & DSI_IRQ_ERROR_MASK) { 6563de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("DSI error, irqstatus %x\n", irqstatus); 6573de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen print_irq_status(irqstatus); 658f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja spin_lock(&dsi->errors_lock); 659f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->errors |= irqstatus & DSI_IRQ_ERROR_MASK; 660f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja spin_unlock(&dsi->errors_lock); 6613de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } else if (debug_irq) { 6623de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen print_irq_status(irqstatus); 6633de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 6643de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 6653de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen for (i = 0; i < 4; ++i) { 66669b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen if (vcstatus[i] & DSI_VC_IRQ_ERROR_MASK) { 66769b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen DSSERR("DSI VC(%d) error, vc irqstatus %x\n", 66869b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen i, vcstatus[i]); 66969b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen print_irq_status_vc(i, vcstatus[i]); 67069b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen } else if (debug_irq) { 67169b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen print_irq_status_vc(i, vcstatus[i]); 67269b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen } 67369b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen } 6743de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 67569b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen if (ciostatus & DSI_CIO_IRQ_ERROR_MASK) { 67669b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen DSSERR("DSI CIO error, cio irqstatus %x\n", ciostatus); 67769b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen print_irq_status_cio(ciostatus); 67869b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen } else if (debug_irq) { 67969b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen print_irq_status_cio(ciostatus); 68069b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen } 68169b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen} 6823de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 6834ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinenstatic void dsi_call_isrs(struct dsi_isr_data *isr_array, 6844ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen unsigned isr_array_size, u32 irqstatus) 6854ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen{ 6864ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen struct dsi_isr_data *isr_data; 6874ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen int i; 6884ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 6894ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen for (i = 0; i < isr_array_size; i++) { 6904ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen isr_data = &isr_array[i]; 6914ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen if (isr_data->isr && isr_data->mask & irqstatus) 6924ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen isr_data->isr(isr_data->arg, irqstatus); 6934ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen } 6944ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen} 6954ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 6964ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinenstatic void dsi_handle_isrs(struct dsi_isr_tables *isr_tables, 6974ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen u32 irqstatus, u32 *vcstatus, u32 ciostatus) 6984ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen{ 6994ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen int i; 7004ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 7014ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen dsi_call_isrs(isr_tables->isr_table, 7024ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen ARRAY_SIZE(isr_tables->isr_table), 7034ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen irqstatus); 7044ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 7054ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen for (i = 0; i < 4; ++i) { 7064ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen if (vcstatus[i] == 0) 7074ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen continue; 7084ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen dsi_call_isrs(isr_tables->isr_table_vc[i], 7094ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen ARRAY_SIZE(isr_tables->isr_table_vc[i]), 7104ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen vcstatus[i]); 7114ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen } 7124ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 7134ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen if (ciostatus != 0) 7144ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen dsi_call_isrs(isr_tables->isr_table_cio, 7154ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen ARRAY_SIZE(isr_tables->isr_table_cio), 7164ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen ciostatus); 7174ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen} 7184ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 71969b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinenstatic irqreturn_t omap_dsi_irq_handler(int irq, void *arg) 72069b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen{ 721a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev; 722f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi; 72369b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen u32 irqstatus, vcstatus[4], ciostatus; 72469b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen int i; 725dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 726a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsidev = (struct platform_device *) arg; 727f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi = dsi_get_dsidrv_data(dsidev); 728a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja 729f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja spin_lock(&dsi->irq_lock); 7304ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 731a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja irqstatus = dsi_read_reg(dsidev, DSI_IRQSTATUS); 7323de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 73369b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen /* IRQ is not for us */ 7344ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen if (!irqstatus) { 735f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja spin_unlock(&dsi->irq_lock); 73669b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen return IRQ_NONE; 7374ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen } 738ab83b14c829e35436b423947bb5b151133314346Tomi Valkeinen 739a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_write_reg(dsidev, DSI_IRQSTATUS, irqstatus & ~DSI_IRQ_CHANNEL_MASK); 74069b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen /* flush posted write */ 741a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_read_reg(dsidev, DSI_IRQSTATUS); 74269b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen 74369b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen for (i = 0; i < 4; ++i) { 74469b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen if ((irqstatus & (1 << i)) == 0) { 74569b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen vcstatus[i] = 0; 74669b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen continue; 7473de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 7483de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 749a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja vcstatus[i] = dsi_read_reg(dsidev, DSI_VC_IRQSTATUS(i)); 75069b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen 751a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_write_reg(dsidev, DSI_VC_IRQSTATUS(i), vcstatus[i]); 7523de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* flush posted write */ 753a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_read_reg(dsidev, DSI_VC_IRQSTATUS(i)); 7543de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 7553de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 7563de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (irqstatus & DSI_IRQ_COMPLEXIO_ERR) { 757a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja ciostatus = dsi_read_reg(dsidev, DSI_COMPLEXIO_IRQ_STATUS); 7583de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 759a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_write_reg(dsidev, DSI_COMPLEXIO_IRQ_STATUS, ciostatus); 7603de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* flush posted write */ 761a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_read_reg(dsidev, DSI_COMPLEXIO_IRQ_STATUS); 76269b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen } else { 76369b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen ciostatus = 0; 76469b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen } 7653de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 76669b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen#ifdef DSI_CATCH_MISSING_TE 76769b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen if (irqstatus & DSI_IRQ_TE_TRIGGER) 768f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja del_timer(&dsi->te_timer); 76969b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen#endif 77069b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen 7714ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen /* make a copy and unlock, so that isrs can unregister 7724ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen * themselves */ 773f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja memcpy(&dsi->isr_tables_copy, &dsi->isr_tables, 774f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja sizeof(dsi->isr_tables)); 7754ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 776f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja spin_unlock(&dsi->irq_lock); 7774ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 778f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi_handle_isrs(&dsi->isr_tables_copy, irqstatus, vcstatus, ciostatus); 7794ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 780a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_handle_irq_errors(dsidev, irqstatus, vcstatus, ciostatus); 78169b281a61442f97e8df14babc9bb6a28624886b1Tomi Valkeinen 782a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_collect_irq_stats(dsidev, irqstatus, vcstatus, ciostatus); 783dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 784affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja return IRQ_HANDLED; 7853de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 7863de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 787f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja/* dsi->irq_lock has to be locked by the caller */ 788a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic void _omap_dsi_configure_irqs(struct platform_device *dsidev, 789a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct dsi_isr_data *isr_array, 7904ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen unsigned isr_array_size, u32 default_mask, 7914ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen const struct dsi_reg enable_reg, 7924ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen const struct dsi_reg status_reg) 7933de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 7944ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen struct dsi_isr_data *isr_data; 7954ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen u32 mask; 7964ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen u32 old_mask; 7973de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen int i; 7983de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 7994ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen mask = default_mask; 8003de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 8014ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen for (i = 0; i < isr_array_size; i++) { 8024ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen isr_data = &isr_array[i]; 8033de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 8044ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen if (isr_data->isr == NULL) 8054ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen continue; 8064ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 8074ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen mask |= isr_data->mask; 8083de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 8093de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 810a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja old_mask = dsi_read_reg(dsidev, enable_reg); 8114ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen /* clear the irqstatus for newly enabled irqs */ 812a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_write_reg(dsidev, status_reg, (mask ^ old_mask) & mask); 813a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_write_reg(dsidev, enable_reg, mask); 8144ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 8154ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen /* flush posted writes */ 816a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_read_reg(dsidev, enable_reg); 817a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_read_reg(dsidev, status_reg); 8184ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen} 8193de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 820f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja/* dsi->irq_lock has to be locked by the caller */ 821a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic void _omap_dsi_set_irqs(struct platform_device *dsidev) 8224ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen{ 823f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 8244ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen u32 mask = DSI_IRQ_ERROR_MASK; 8253de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#ifdef DSI_CATCH_MISSING_TE 8264ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen mask |= DSI_IRQ_TE_TRIGGER; 8273de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#endif 828f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja _omap_dsi_configure_irqs(dsidev, dsi->isr_tables.isr_table, 829f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja ARRAY_SIZE(dsi->isr_tables.isr_table), mask, 8304ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen DSI_IRQENABLE, DSI_IRQSTATUS); 8314ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen} 8323de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 833f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja/* dsi->irq_lock has to be locked by the caller */ 834a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic void _omap_dsi_set_irqs_vc(struct platform_device *dsidev, int vc) 8354ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen{ 836f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 837f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 838f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja _omap_dsi_configure_irqs(dsidev, dsi->isr_tables.isr_table_vc[vc], 839f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja ARRAY_SIZE(dsi->isr_tables.isr_table_vc[vc]), 8404ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen DSI_VC_IRQ_ERROR_MASK, 8414ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen DSI_VC_IRQENABLE(vc), DSI_VC_IRQSTATUS(vc)); 8424ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen} 8434ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 844f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja/* dsi->irq_lock has to be locked by the caller */ 845a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic void _omap_dsi_set_irqs_cio(struct platform_device *dsidev) 8464ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen{ 847f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 848f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 849f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja _omap_dsi_configure_irqs(dsidev, dsi->isr_tables.isr_table_cio, 850f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja ARRAY_SIZE(dsi->isr_tables.isr_table_cio), 8514ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen DSI_CIO_IRQ_ERROR_MASK, 8524ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen DSI_COMPLEXIO_IRQ_ENABLE, DSI_COMPLEXIO_IRQ_STATUS); 8534ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen} 8544ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 855a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic void _dsi_initialize_irq(struct platform_device *dsidev) 8564ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen{ 857f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 8584ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen unsigned long flags; 8594ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen int vc; 8604ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 861f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja spin_lock_irqsave(&dsi->irq_lock, flags); 8624ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 863f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja memset(&dsi->isr_tables, 0, sizeof(dsi->isr_tables)); 8644ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 865a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja _omap_dsi_set_irqs(dsidev); 8664ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen for (vc = 0; vc < 4; ++vc) 867a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja _omap_dsi_set_irqs_vc(dsidev, vc); 868a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja _omap_dsi_set_irqs_cio(dsidev); 8694ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 870f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja spin_unlock_irqrestore(&dsi->irq_lock, flags); 8714ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen} 8723de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 8734ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinenstatic int _dsi_register_isr(omap_dsi_isr_t isr, void *arg, u32 mask, 8744ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen struct dsi_isr_data *isr_array, unsigned isr_array_size) 8754ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen{ 8764ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen struct dsi_isr_data *isr_data; 8774ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen int free_idx; 8784ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen int i; 8794ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 8804ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen BUG_ON(isr == NULL); 8814ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 8824ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen /* check for duplicate entry and find a free slot */ 8834ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen free_idx = -1; 8844ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen for (i = 0; i < isr_array_size; i++) { 8854ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen isr_data = &isr_array[i]; 8864ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 8874ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen if (isr_data->isr == isr && isr_data->arg == arg && 8884ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen isr_data->mask == mask) { 8894ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen return -EINVAL; 8904ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen } 8914ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 8924ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen if (isr_data->isr == NULL && free_idx == -1) 8934ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen free_idx = i; 8944ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen } 8954ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 8964ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen if (free_idx == -1) 8974ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen return -EBUSY; 8984ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 8994ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen isr_data = &isr_array[free_idx]; 9004ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen isr_data->isr = isr; 9014ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen isr_data->arg = arg; 9024ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen isr_data->mask = mask; 9034ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 9044ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen return 0; 9054ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen} 9064ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 9074ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinenstatic int _dsi_unregister_isr(omap_dsi_isr_t isr, void *arg, u32 mask, 9084ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen struct dsi_isr_data *isr_array, unsigned isr_array_size) 9094ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen{ 9104ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen struct dsi_isr_data *isr_data; 9114ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen int i; 9124ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 9134ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen for (i = 0; i < isr_array_size; i++) { 9144ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen isr_data = &isr_array[i]; 9154ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen if (isr_data->isr != isr || isr_data->arg != arg || 9164ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen isr_data->mask != mask) 9174ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen continue; 9184ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 9194ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen isr_data->isr = NULL; 9204ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen isr_data->arg = NULL; 9214ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen isr_data->mask = 0; 9224ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 9234ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen return 0; 9244ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen } 9254ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 9264ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen return -EINVAL; 9274ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen} 9284ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 929a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic int dsi_register_isr(struct platform_device *dsidev, omap_dsi_isr_t isr, 930a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja void *arg, u32 mask) 9314ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen{ 932f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 9334ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen unsigned long flags; 9344ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen int r; 9354ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 936f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja spin_lock_irqsave(&dsi->irq_lock, flags); 9374ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 938f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja r = _dsi_register_isr(isr, arg, mask, dsi->isr_tables.isr_table, 939f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja ARRAY_SIZE(dsi->isr_tables.isr_table)); 9404ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 9414ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen if (r == 0) 942a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja _omap_dsi_set_irqs(dsidev); 9434ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 944f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja spin_unlock_irqrestore(&dsi->irq_lock, flags); 9454ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 9464ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen return r; 9474ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen} 9484ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 949a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic int dsi_unregister_isr(struct platform_device *dsidev, 950a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja omap_dsi_isr_t isr, void *arg, u32 mask) 9514ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen{ 952f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 9534ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen unsigned long flags; 9544ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen int r; 9554ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 956f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja spin_lock_irqsave(&dsi->irq_lock, flags); 9574ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 958f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja r = _dsi_unregister_isr(isr, arg, mask, dsi->isr_tables.isr_table, 959f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja ARRAY_SIZE(dsi->isr_tables.isr_table)); 9604ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 9614ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen if (r == 0) 962a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja _omap_dsi_set_irqs(dsidev); 9634ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 964f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja spin_unlock_irqrestore(&dsi->irq_lock, flags); 9654ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 9664ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen return r; 9674ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen} 9684ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 969a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic int dsi_register_isr_vc(struct platform_device *dsidev, int channel, 970a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja omap_dsi_isr_t isr, void *arg, u32 mask) 9714ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen{ 972f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 9734ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen unsigned long flags; 9744ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen int r; 9754ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 976f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja spin_lock_irqsave(&dsi->irq_lock, flags); 9774ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 9784ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen r = _dsi_register_isr(isr, arg, mask, 979f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->isr_tables.isr_table_vc[channel], 980f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja ARRAY_SIZE(dsi->isr_tables.isr_table_vc[channel])); 9814ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 9824ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen if (r == 0) 983a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja _omap_dsi_set_irqs_vc(dsidev, channel); 9844ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 985f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja spin_unlock_irqrestore(&dsi->irq_lock, flags); 9864ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 9874ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen return r; 9884ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen} 9894ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 990a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic int dsi_unregister_isr_vc(struct platform_device *dsidev, int channel, 991a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja omap_dsi_isr_t isr, void *arg, u32 mask) 9924ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen{ 993f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 9944ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen unsigned long flags; 9954ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen int r; 9964ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 997f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja spin_lock_irqsave(&dsi->irq_lock, flags); 9984ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 9994ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen r = _dsi_unregister_isr(isr, arg, mask, 1000f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->isr_tables.isr_table_vc[channel], 1001f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja ARRAY_SIZE(dsi->isr_tables.isr_table_vc[channel])); 10024ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 10034ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen if (r == 0) 1004a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja _omap_dsi_set_irqs_vc(dsidev, channel); 10054ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 1006f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja spin_unlock_irqrestore(&dsi->irq_lock, flags); 10074ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 10084ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen return r; 10094ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen} 10104ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 1011a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic int dsi_register_isr_cio(struct platform_device *dsidev, 1012a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja omap_dsi_isr_t isr, void *arg, u32 mask) 10134ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen{ 1014f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 10154ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen unsigned long flags; 10164ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen int r; 10174ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 1018f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja spin_lock_irqsave(&dsi->irq_lock, flags); 10194ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 1020f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja r = _dsi_register_isr(isr, arg, mask, dsi->isr_tables.isr_table_cio, 1021f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja ARRAY_SIZE(dsi->isr_tables.isr_table_cio)); 10224ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 10234ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen if (r == 0) 1024a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja _omap_dsi_set_irqs_cio(dsidev); 10254ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 1026f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja spin_unlock_irqrestore(&dsi->irq_lock, flags); 10274ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 10284ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen return r; 10294ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen} 10304ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 1031a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic int dsi_unregister_isr_cio(struct platform_device *dsidev, 1032a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja omap_dsi_isr_t isr, void *arg, u32 mask) 10334ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen{ 1034f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 10354ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen unsigned long flags; 10364ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen int r; 10374ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 1038f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja spin_lock_irqsave(&dsi->irq_lock, flags); 10394ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 1040f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja r = _dsi_unregister_isr(isr, arg, mask, dsi->isr_tables.isr_table_cio, 1041f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja ARRAY_SIZE(dsi->isr_tables.isr_table_cio)); 10424ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 10434ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen if (r == 0) 1044a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja _omap_dsi_set_irqs_cio(dsidev); 10454ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 1046f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja spin_unlock_irqrestore(&dsi->irq_lock, flags); 10474ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen 10484ae2ddddf44cd9f73def2dbdb68c6859072262ffTomi Valkeinen return r; 10493de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 10503de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1051a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic u32 dsi_get_errors(struct platform_device *dsidev) 10523de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 1053f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 10543de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen unsigned long flags; 10553de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u32 e; 1056f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja spin_lock_irqsave(&dsi->errors_lock, flags); 1057f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja e = dsi->errors; 1058f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->errors = 0; 1059f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja spin_unlock_irqrestore(&dsi->errors_lock, flags); 10603de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return e; 10613de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 10623de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 10634fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenint dsi_runtime_get(struct platform_device *dsidev) 10643de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 10654fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen int r; 10664fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 10674fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 10684fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen DSSDBG("dsi_runtime_get\n"); 10694fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 10704fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen r = pm_runtime_get_sync(&dsi->pdev->dev); 10714fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen WARN_ON(r < 0); 10724fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen return r < 0 ? r : 0; 10734fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen} 10744fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 10754fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenvoid dsi_runtime_put(struct platform_device *dsidev) 10764fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen{ 10774fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 10784fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen int r; 10794fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 10804fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen DSSDBG("dsi_runtime_put\n"); 10814fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 10820eaf9f52e94f756147dbfe1faf1f77a02378dbf9Tomi Valkeinen r = pm_runtime_put_sync(&dsi->pdev->dev); 10834fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen WARN_ON(r < 0); 10843de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 10853de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 10863de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen/* source clock for DSI PLL. this could also be PCLKFREE */ 1087a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic inline void dsi_enable_pll_clock(struct platform_device *dsidev, 1088a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja bool enable) 10893de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 1090f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 1091f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 10923de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (enable) 10934fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen clk_enable(dsi->sys_clk); 10943de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen else 10954fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen clk_disable(dsi->sys_clk); 10963de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1097f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (enable && dsi->pll_locked) { 1098a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja if (wait_for_bit_change(dsidev, DSI_PLL_STATUS, 1, 1) != 1) 10993de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("cannot lock PLL when enabling clocks\n"); 11003de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 11013de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 11023de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 11033de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#ifdef DEBUG 1104a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic void _dsi_print_reset_status(struct platform_device *dsidev) 11053de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 11063de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u32 l; 1107c335cbf94e7450fb41aafe97e805752a830d3a43Tomi Valkeinen int b0, b1, b2; 11083de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 11093de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (!dss_debug) 11103de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return; 11113de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 11123de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* A dummy read using the SCP interface to any DSIPHY register is 11133de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen * required after DSIPHY reset to complete the reset of the DSI complex 11143de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen * I/O. */ 1115a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja l = dsi_read_reg(dsidev, DSI_DSIPHY_CFG5); 11163de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 11173de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen printk(KERN_DEBUG "DSI resets: "); 11183de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1119a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja l = dsi_read_reg(dsidev, DSI_PLL_STATUS); 11203de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen printk("PLL (%d) ", FLD_GET(l, 0, 0)); 11213de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1122a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja l = dsi_read_reg(dsidev, DSI_COMPLEXIO_CFG1); 11233de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen printk("CIO (%d) ", FLD_GET(l, 29, 29)); 11243de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1125c335cbf94e7450fb41aafe97e805752a830d3a43Tomi Valkeinen if (dss_has_feature(FEAT_DSI_REVERSE_TXCLKESC)) { 1126c335cbf94e7450fb41aafe97e805752a830d3a43Tomi Valkeinen b0 = 28; 1127c335cbf94e7450fb41aafe97e805752a830d3a43Tomi Valkeinen b1 = 27; 1128c335cbf94e7450fb41aafe97e805752a830d3a43Tomi Valkeinen b2 = 26; 1129c335cbf94e7450fb41aafe97e805752a830d3a43Tomi Valkeinen } else { 1130c335cbf94e7450fb41aafe97e805752a830d3a43Tomi Valkeinen b0 = 24; 1131c335cbf94e7450fb41aafe97e805752a830d3a43Tomi Valkeinen b1 = 25; 1132c335cbf94e7450fb41aafe97e805752a830d3a43Tomi Valkeinen b2 = 26; 1133c335cbf94e7450fb41aafe97e805752a830d3a43Tomi Valkeinen } 1134c335cbf94e7450fb41aafe97e805752a830d3a43Tomi Valkeinen 1135a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja l = dsi_read_reg(dsidev, DSI_DSIPHY_CFG5); 1136c335cbf94e7450fb41aafe97e805752a830d3a43Tomi Valkeinen printk("PHY (%x%x%x, %d, %d, %d)\n", 1137c335cbf94e7450fb41aafe97e805752a830d3a43Tomi Valkeinen FLD_GET(l, b0, b0), 1138c335cbf94e7450fb41aafe97e805752a830d3a43Tomi Valkeinen FLD_GET(l, b1, b1), 1139c335cbf94e7450fb41aafe97e805752a830d3a43Tomi Valkeinen FLD_GET(l, b2, b2), 11403de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen FLD_GET(l, 29, 29), 11413de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen FLD_GET(l, 30, 30), 11423de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen FLD_GET(l, 31, 31)); 11433de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 11443de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#else 1145a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja#define _dsi_print_reset_status(x) 11463de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#endif 11473de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1148a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic inline int dsi_if_enable(struct platform_device *dsidev, bool enable) 11493de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 11503de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("dsi_if_enable(%d)\n", enable); 11513de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 11523de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen enable = enable ? 1 : 0; 1153a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja REG_FLD_MOD(dsidev, DSI_CTRL, enable, 0, 0); /* IF_EN */ 11543de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1155a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja if (wait_for_bit_change(dsidev, DSI_CTRL, 0, enable) != enable) { 11563de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("Failed to set dsi_if_enable to %d\n", enable); 11573de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return -EIO; 11583de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 11593de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 11603de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return 0; 11613de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 11623de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1163a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejaunsigned long dsi_get_pll_hsdiv_dispc_rate(struct platform_device *dsidev) 11643de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 1165f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 1166f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 1167f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja return dsi->current_cinfo.dsi_pll_hsdiv_dispc_clk; 11683de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 11693de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1170a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic unsigned long dsi_get_pll_hsdiv_dsi_rate(struct platform_device *dsidev) 11713de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 1172f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 1173f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 1174f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja return dsi->current_cinfo.dsi_pll_hsdiv_dsi_clk; 11753de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 11763de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1177a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic unsigned long dsi_get_txbyteclkhs(struct platform_device *dsidev) 11783de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 1179f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 1180f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 1181f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja return dsi->current_cinfo.clkin4ddr / 16; 11823de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 11833de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1184a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic unsigned long dsi_fclk_rate(struct platform_device *dsidev) 11853de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 11863de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen unsigned long r; 11875a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja int dsi_module = dsi_get_dsidev_id(dsidev); 11884fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 11893de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 11905a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja if (dss_get_dsi_clk_source(dsi_module) == OMAP_DSS_CLK_SRC_FCK) { 11911bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja /* DSI FCLK source is DSS_CLK_FCK */ 11924fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen r = clk_get_rate(dsi->dss_clk); 11933de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } else { 11941bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja /* DSI FCLK source is dsi_pll_hsdiv_dsi_clk */ 1195a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja r = dsi_get_pll_hsdiv_dsi_rate(dsidev); 11963de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 11973de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 11983de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return r; 11993de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 12003de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 12013de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinenstatic int dsi_set_lp_clk_divisor(struct omap_dss_device *dssdev) 12023de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 1203a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 1204f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 12053de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen unsigned long dsi_fclk; 12063de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen unsigned lp_clk_div; 12073de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen unsigned long lp_clk; 12083de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1209c6940a3dc59d9628c8d407b98b6f57df69e3ef52Tomi Valkeinen lp_clk_div = dssdev->clocks.dsi.lp_clk_div; 12103de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1211f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (lp_clk_div == 0 || lp_clk_div > dsi->lpdiv_max) 12123de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return -EINVAL; 12133de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1214a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_fclk = dsi_fclk_rate(dsidev); 12153de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 12163de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen lp_clk = dsi_fclk / 2 / lp_clk_div; 12173de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 12183de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("LP_CLK_DIV %u, LP_CLK %lu\n", lp_clk_div, lp_clk); 1219f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->current_cinfo.lp_clk = lp_clk; 1220f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->current_cinfo.lp_clk_div = lp_clk_div; 12213de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1222a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja /* LP_CLK_DIVISOR */ 1223a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja REG_FLD_MOD(dsidev, DSI_CLK_CTRL, lp_clk_div, 12, 0); 12243de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1225a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja /* LP_RX_SYNCHRO_ENABLE */ 1226a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja REG_FLD_MOD(dsidev, DSI_CLK_CTRL, dsi_fclk > 30000000 ? 1 : 0, 21, 21); 12273de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 12283de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return 0; 12293de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 12303de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1231a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic void dsi_enable_scp_clk(struct platform_device *dsidev) 123224c1ae4191e911caa08b31079d61ff4db319a101Tomi Valkeinen{ 1233f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 1234f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 1235f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (dsi->scp_clk_refcount++ == 0) 1236a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja REG_FLD_MOD(dsidev, DSI_CLK_CTRL, 1, 14, 14); /* CIO_CLK_ICG */ 123724c1ae4191e911caa08b31079d61ff4db319a101Tomi Valkeinen} 123824c1ae4191e911caa08b31079d61ff4db319a101Tomi Valkeinen 1239a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic void dsi_disable_scp_clk(struct platform_device *dsidev) 124024c1ae4191e911caa08b31079d61ff4db319a101Tomi Valkeinen{ 1241f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 1242f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 1243f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja WARN_ON(dsi->scp_clk_refcount == 0); 1244f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (--dsi->scp_clk_refcount == 0) 1245a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja REG_FLD_MOD(dsidev, DSI_CLK_CTRL, 0, 14, 14); /* CIO_CLK_ICG */ 124624c1ae4191e911caa08b31079d61ff4db319a101Tomi Valkeinen} 12473de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 12483de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinenenum dsi_pll_power_state { 12493de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSI_PLL_POWER_OFF = 0x0, 12503de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSI_PLL_POWER_ON_HSCLK = 0x1, 12513de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSI_PLL_POWER_ON_ALL = 0x2, 12523de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSI_PLL_POWER_ON_DIV = 0x3, 12533de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen}; 12543de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1255a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic int dsi_pll_power(struct platform_device *dsidev, 1256a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja enum dsi_pll_power_state state) 12573de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 12583de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen int t = 0; 12593de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1260c94dfe05c4b6c269e445691c1fc7a9d8679ba60fTomi Valkeinen /* DSI-PLL power command 0x3 is not working */ 1261c94dfe05c4b6c269e445691c1fc7a9d8679ba60fTomi Valkeinen if (dss_has_feature(FEAT_DSI_PLL_PWR_BUG) && 1262c94dfe05c4b6c269e445691c1fc7a9d8679ba60fTomi Valkeinen state == DSI_PLL_POWER_ON_DIV) 1263c94dfe05c4b6c269e445691c1fc7a9d8679ba60fTomi Valkeinen state = DSI_PLL_POWER_ON_ALL; 1264c94dfe05c4b6c269e445691c1fc7a9d8679ba60fTomi Valkeinen 1265a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja /* PLL_PWR_CMD */ 1266a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja REG_FLD_MOD(dsidev, DSI_CLK_CTRL, state, 31, 30); 12673de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 12683de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* PLL_PWR_STATUS */ 1269a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja while (FLD_GET(dsi_read_reg(dsidev, DSI_CLK_CTRL), 29, 28) != state) { 127024be78b32f0a6e14aead3eac89d768a361b091b3Tomi Valkeinen if (++t > 1000) { 12713de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("Failed to set DSI PLL power mode to %d\n", 12723de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen state); 12733de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return -ENODEV; 12743de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 127524be78b32f0a6e14aead3eac89d768a361b091b3Tomi Valkeinen udelay(1); 12763de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 12773de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 12783de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return 0; 12793de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 12803de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 12813de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen/* calculate clock rates using dividers in cinfo */ 1282ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwalstatic int dsi_calc_clock_rates(struct omap_dss_device *dssdev, 1283ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal struct dsi_clock_info *cinfo) 12843de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 1285f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 1286f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 1287f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 1288f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (cinfo->regn == 0 || cinfo->regn > dsi->regn_max) 12893de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return -EINVAL; 12903de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1291f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (cinfo->regm == 0 || cinfo->regm > dsi->regm_max) 12923de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return -EINVAL; 12933de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1294f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (cinfo->regm_dispc > dsi->regm_dispc_max) 12953de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return -EINVAL; 12963de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1297f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (cinfo->regm_dsi > dsi->regm_dsi_max) 12983de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return -EINVAL; 12993de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 13001bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja if (cinfo->use_sys_clk) { 13014fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen cinfo->clkin = clk_get_rate(dsi->sys_clk); 13023de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* XXX it is unclear if highfreq should be used 13031bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja * with DSS_SYS_CLK source also */ 13043de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen cinfo->highfreq = 0; 13053de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } else { 130626d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen cinfo->clkin = dispc_mgr_pclk_rate(dssdev->manager->id); 13073de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 13083de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (cinfo->clkin < 32000000) 13093de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen cinfo->highfreq = 0; 13103de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen else 13113de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen cinfo->highfreq = 1; 13123de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 13133de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 13143de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen cinfo->fint = cinfo->clkin / (cinfo->regn * (cinfo->highfreq ? 2 : 1)); 13153de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1316f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (cinfo->fint > dsi->fint_max || cinfo->fint < dsi->fint_min) 13173de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return -EINVAL; 13183de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 13193de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen cinfo->clkin4ddr = 2 * cinfo->regm * cinfo->fint; 13203de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 13213de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (cinfo->clkin4ddr > 1800 * 1000 * 1000) 13223de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return -EINVAL; 13233de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 13241bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja if (cinfo->regm_dispc > 0) 13251bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja cinfo->dsi_pll_hsdiv_dispc_clk = 13261bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja cinfo->clkin4ddr / cinfo->regm_dispc; 13273de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen else 13281bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja cinfo->dsi_pll_hsdiv_dispc_clk = 0; 13293de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 13301bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja if (cinfo->regm_dsi > 0) 13311bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja cinfo->dsi_pll_hsdiv_dsi_clk = 13321bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja cinfo->clkin4ddr / cinfo->regm_dsi; 13333de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen else 13341bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja cinfo->dsi_pll_hsdiv_dsi_clk = 0; 13353de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 13363de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return 0; 13373de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 13383de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1339a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejaint dsi_pll_calc_clock_div_pck(struct platform_device *dsidev, bool is_tft, 1340a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja unsigned long req_pck, struct dsi_clock_info *dsi_cinfo, 13413de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen struct dispc_clock_info *dispc_cinfo) 13423de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 1343f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 13443de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen struct dsi_clock_info cur, best; 13453de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen struct dispc_clock_info best_dispc; 13463de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen int min_fck_per_pck; 13473de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen int match = 0; 13481bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja unsigned long dss_sys_clk, max_dss_fck; 13493de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 13504fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dss_sys_clk = clk_get_rate(dsi->sys_clk); 13513de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 135231ef82377f1e0f1bc7d308ae4312e6cc5a431885Archit Taneja max_dss_fck = dss_feat_get_param_max(FEAT_PARAM_DSS_FCK); 1353819d807c59af10cce1dcbb13539c2fb100953fcdArchit Taneja 1354f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (req_pck == dsi->cache_req_pck && 1355f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->cache_cinfo.clkin == dss_sys_clk) { 13563de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("DSI clock info found from cache\n"); 1357f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja *dsi_cinfo = dsi->cache_cinfo; 13581bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja dispc_find_clk_divs(is_tft, req_pck, 13591bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja dsi_cinfo->dsi_pll_hsdiv_dispc_clk, dispc_cinfo); 13603de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return 0; 13613de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 13623de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 13633de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen min_fck_per_pck = CONFIG_OMAP2_DSS_MIN_FCK_PER_PCK; 13643de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 13653de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (min_fck_per_pck && 1366819d807c59af10cce1dcbb13539c2fb100953fcdArchit Taneja req_pck * min_fck_per_pck > max_dss_fck) { 13673de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("Requested pixel clock not possible with the current " 13683de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen "OMAP2_DSS_MIN_FCK_PER_PCK setting. Turning " 13693de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen "the constraint off.\n"); 13703de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen min_fck_per_pck = 0; 13713de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 13723de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 13733de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("dsi_pll_calc\n"); 13743de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 13753de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinenretry: 13763de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen memset(&best, 0, sizeof(best)); 13773de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen memset(&best_dispc, 0, sizeof(best_dispc)); 13783de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 13793de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen memset(&cur, 0, sizeof(cur)); 13801bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja cur.clkin = dss_sys_clk; 13811bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja cur.use_sys_clk = 1; 13823de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen cur.highfreq = 0; 13833de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 13843de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* no highfreq: 0.75MHz < Fint = clkin / regn < 2.1MHz */ 13853de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* highfreq: 0.75MHz < Fint = clkin / (2*regn) < 2.1MHz */ 13863de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* To reduce PLL lock time, keep Fint high (around 2 MHz) */ 1387f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja for (cur.regn = 1; cur.regn < dsi->regn_max; ++cur.regn) { 13883de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (cur.highfreq == 0) 13893de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen cur.fint = cur.clkin / cur.regn; 13903de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen else 13913de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen cur.fint = cur.clkin / (2 * cur.regn); 13923de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1393f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (cur.fint > dsi->fint_max || cur.fint < dsi->fint_min) 13943de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen continue; 13953de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 13963de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* DSIPHY(MHz) = (2 * regm / regn) * (clkin / (highfreq + 1)) */ 1397f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja for (cur.regm = 1; cur.regm < dsi->regm_max; ++cur.regm) { 13983de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen unsigned long a, b; 13993de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 14003de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen a = 2 * cur.regm * (cur.clkin/1000); 14013de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen b = cur.regn * (cur.highfreq + 1); 14023de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen cur.clkin4ddr = a / b * 1000; 14033de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 14043de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (cur.clkin4ddr > 1800 * 1000 * 1000) 14053de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen break; 14063de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 14071bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja /* dsi_pll_hsdiv_dispc_clk(MHz) = 14081bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja * DSIPHY(MHz) / regm_dispc < 173MHz/186Mhz */ 1409f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja for (cur.regm_dispc = 1; cur.regm_dispc < 1410f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->regm_dispc_max; ++cur.regm_dispc) { 14113de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen struct dispc_clock_info cur_dispc; 14121bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja cur.dsi_pll_hsdiv_dispc_clk = 14131bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja cur.clkin4ddr / cur.regm_dispc; 14143de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 14153de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* this will narrow down the search a bit, 14163de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen * but still give pixclocks below what was 14173de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen * requested */ 14181bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja if (cur.dsi_pll_hsdiv_dispc_clk < req_pck) 14193de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen break; 14203de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 14211bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja if (cur.dsi_pll_hsdiv_dispc_clk > max_dss_fck) 14223de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen continue; 14233de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 14243de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (min_fck_per_pck && 14251bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja cur.dsi_pll_hsdiv_dispc_clk < 14263de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen req_pck * min_fck_per_pck) 14273de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen continue; 14283de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 14293de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen match = 1; 14303de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 14313de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen dispc_find_clk_divs(is_tft, req_pck, 14321bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja cur.dsi_pll_hsdiv_dispc_clk, 14333de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen &cur_dispc); 14343de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 14353de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (abs(cur_dispc.pck - req_pck) < 14363de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen abs(best_dispc.pck - req_pck)) { 14373de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen best = cur; 14383de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen best_dispc = cur_dispc; 14393de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 14403de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (cur_dispc.pck == req_pck) 14413de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen goto found; 14423de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 14433de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 14443de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 14453de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 14463de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinenfound: 14473de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (!match) { 14483de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (min_fck_per_pck) { 14493de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("Could not find suitable clock settings.\n" 14503de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen "Turning FCK/PCK constraint off and" 14513de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen "trying again.\n"); 14523de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen min_fck_per_pck = 0; 14533de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen goto retry; 14543de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 14553de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 14563de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("Could not find suitable clock settings.\n"); 14573de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 14583de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return -EINVAL; 14593de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 14603de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 14611bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja /* dsi_pll_hsdiv_dsi_clk (regm_dsi) is not used */ 14621bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja best.regm_dsi = 0; 14631bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja best.dsi_pll_hsdiv_dsi_clk = 0; 14643de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 14653de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (dsi_cinfo) 14663de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen *dsi_cinfo = best; 14673de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (dispc_cinfo) 14683de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen *dispc_cinfo = best_dispc; 14693de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1470f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->cache_req_pck = req_pck; 1471f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->cache_clk_freq = 0; 1472f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->cache_cinfo = best; 14733de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 14743de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return 0; 14753de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 14763de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1477a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejaint dsi_pll_set_clock_div(struct platform_device *dsidev, 1478a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct dsi_clock_info *cinfo) 14793de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 1480f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 14813de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen int r = 0; 14823de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u32 l; 14839613c02b5feba3ea03ab34f1422dd122c6e54f57Archit Taneja int f = 0; 148449641116392ad7522fa0efad53f7ed63f811bd88Archit Taneja u8 regn_start, regn_end, regm_start, regm_end; 148549641116392ad7522fa0efad53f7ed63f811bd88Archit Taneja u8 regm_dispc_start, regm_dispc_end, regm_dsi_start, regm_dsi_end; 14863de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 14873de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBGF(); 14883de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1489f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->current_cinfo.use_sys_clk = cinfo->use_sys_clk; 1490f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->current_cinfo.highfreq = cinfo->highfreq; 1491b2765092aed717ef9fd14bf5f82024359aff0576Tomi Valkeinen 1492f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->current_cinfo.fint = cinfo->fint; 1493f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->current_cinfo.clkin4ddr = cinfo->clkin4ddr; 1494f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->current_cinfo.dsi_pll_hsdiv_dispc_clk = 14951bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja cinfo->dsi_pll_hsdiv_dispc_clk; 1496f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->current_cinfo.dsi_pll_hsdiv_dsi_clk = 14971bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja cinfo->dsi_pll_hsdiv_dsi_clk; 14983de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1499f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->current_cinfo.regn = cinfo->regn; 1500f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->current_cinfo.regm = cinfo->regm; 1501f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->current_cinfo.regm_dispc = cinfo->regm_dispc; 1502f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->current_cinfo.regm_dsi = cinfo->regm_dsi; 15033de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 15043de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("DSI Fint %ld\n", cinfo->fint); 15053de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 15063de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("clkin (%s) rate %ld, highfreq %d\n", 15071bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja cinfo->use_sys_clk ? "dss_sys_clk" : "pclkfree", 15083de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen cinfo->clkin, 15093de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen cinfo->highfreq); 15103de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 15113de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* DSIPHY == CLKIN4DDR */ 15123de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("CLKIN4DDR = 2 * %d / %d * %lu / %d = %lu\n", 15133de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen cinfo->regm, 15143de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen cinfo->regn, 15153de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen cinfo->clkin, 15163de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen cinfo->highfreq + 1, 15173de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen cinfo->clkin4ddr); 15183de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 15193de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("Data rate on 1 DSI lane %ld Mbps\n", 15203de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen cinfo->clkin4ddr / 1000 / 1000 / 2); 15213de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 15223de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("Clock lane freq %ld Hz\n", cinfo->clkin4ddr / 4); 15233de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 15241bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja DSSDBG("regm_dispc = %d, %s (%s) = %lu\n", cinfo->regm_dispc, 152589a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja dss_get_generic_clk_source_name(OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC), 152689a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja dss_feat_get_clk_source_name(OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC), 15271bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja cinfo->dsi_pll_hsdiv_dispc_clk); 15281bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja DSSDBG("regm_dsi = %d, %s (%s) = %lu\n", cinfo->regm_dsi, 152989a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja dss_get_generic_clk_source_name(OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DSI), 153089a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja dss_feat_get_clk_source_name(OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DSI), 15311bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja cinfo->dsi_pll_hsdiv_dsi_clk); 15323de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 153349641116392ad7522fa0efad53f7ed63f811bd88Archit Taneja dss_feat_get_reg_field(FEAT_REG_DSIPLL_REGN, ®n_start, ®n_end); 153449641116392ad7522fa0efad53f7ed63f811bd88Archit Taneja dss_feat_get_reg_field(FEAT_REG_DSIPLL_REGM, ®m_start, ®m_end); 153549641116392ad7522fa0efad53f7ed63f811bd88Archit Taneja dss_feat_get_reg_field(FEAT_REG_DSIPLL_REGM_DISPC, ®m_dispc_start, 153649641116392ad7522fa0efad53f7ed63f811bd88Archit Taneja ®m_dispc_end); 153749641116392ad7522fa0efad53f7ed63f811bd88Archit Taneja dss_feat_get_reg_field(FEAT_REG_DSIPLL_REGM_DSI, ®m_dsi_start, 153849641116392ad7522fa0efad53f7ed63f811bd88Archit Taneja ®m_dsi_end); 153949641116392ad7522fa0efad53f7ed63f811bd88Archit Taneja 1540a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja /* DSI_PLL_AUTOMODE = manual */ 1541a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja REG_FLD_MOD(dsidev, DSI_PLL_CONTROL, 0, 0, 0); 15423de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1543a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja l = dsi_read_reg(dsidev, DSI_PLL_CONFIGURATION1); 15443de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen l = FLD_MOD(l, 1, 0, 0); /* DSI_PLL_STOPMODE */ 154549641116392ad7522fa0efad53f7ed63f811bd88Archit Taneja /* DSI_PLL_REGN */ 154649641116392ad7522fa0efad53f7ed63f811bd88Archit Taneja l = FLD_MOD(l, cinfo->regn - 1, regn_start, regn_end); 154749641116392ad7522fa0efad53f7ed63f811bd88Archit Taneja /* DSI_PLL_REGM */ 154849641116392ad7522fa0efad53f7ed63f811bd88Archit Taneja l = FLD_MOD(l, cinfo->regm, regm_start, regm_end); 154949641116392ad7522fa0efad53f7ed63f811bd88Archit Taneja /* DSI_CLOCK_DIV */ 15501bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja l = FLD_MOD(l, cinfo->regm_dispc > 0 ? cinfo->regm_dispc - 1 : 0, 155149641116392ad7522fa0efad53f7ed63f811bd88Archit Taneja regm_dispc_start, regm_dispc_end); 155249641116392ad7522fa0efad53f7ed63f811bd88Archit Taneja /* DSIPROTO_CLOCK_DIV */ 15531bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja l = FLD_MOD(l, cinfo->regm_dsi > 0 ? cinfo->regm_dsi - 1 : 0, 155449641116392ad7522fa0efad53f7ed63f811bd88Archit Taneja regm_dsi_start, regm_dsi_end); 1555a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_write_reg(dsidev, DSI_PLL_CONFIGURATION1, l); 15563de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1557f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja BUG_ON(cinfo->fint < dsi->fint_min || cinfo->fint > dsi->fint_max); 15589613c02b5feba3ea03ab34f1422dd122c6e54f57Archit Taneja 15599613c02b5feba3ea03ab34f1422dd122c6e54f57Archit Taneja if (dss_has_feature(FEAT_DSI_PLL_FREQSEL)) { 15609613c02b5feba3ea03ab34f1422dd122c6e54f57Archit Taneja f = cinfo->fint < 1000000 ? 0x3 : 15619613c02b5feba3ea03ab34f1422dd122c6e54f57Archit Taneja cinfo->fint < 1250000 ? 0x4 : 15629613c02b5feba3ea03ab34f1422dd122c6e54f57Archit Taneja cinfo->fint < 1500000 ? 0x5 : 15639613c02b5feba3ea03ab34f1422dd122c6e54f57Archit Taneja cinfo->fint < 1750000 ? 0x6 : 15649613c02b5feba3ea03ab34f1422dd122c6e54f57Archit Taneja 0x7; 15659613c02b5feba3ea03ab34f1422dd122c6e54f57Archit Taneja } 15663de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1567a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja l = dsi_read_reg(dsidev, DSI_PLL_CONFIGURATION2); 15689613c02b5feba3ea03ab34f1422dd122c6e54f57Archit Taneja 15699613c02b5feba3ea03ab34f1422dd122c6e54f57Archit Taneja if (dss_has_feature(FEAT_DSI_PLL_FREQSEL)) 15709613c02b5feba3ea03ab34f1422dd122c6e54f57Archit Taneja l = FLD_MOD(l, f, 4, 1); /* DSI_PLL_FREQSEL */ 15711bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja l = FLD_MOD(l, cinfo->use_sys_clk ? 0 : 1, 15723de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 11, 11); /* DSI_PLL_CLKSEL */ 15733de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen l = FLD_MOD(l, cinfo->highfreq, 15743de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 12, 12); /* DSI_PLL_HIGHFREQ */ 15753de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen l = FLD_MOD(l, 1, 13, 13); /* DSI_PLL_REFEN */ 15763de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen l = FLD_MOD(l, 0, 14, 14); /* DSIPHY_CLKINEN */ 15773de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen l = FLD_MOD(l, 1, 20, 20); /* DSI_HSDIVBYPASS */ 1578a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_write_reg(dsidev, DSI_PLL_CONFIGURATION2, l); 15793de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1580a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja REG_FLD_MOD(dsidev, DSI_PLL_GO, 1, 0, 0); /* DSI_PLL_GO */ 15813de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1582a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja if (wait_for_bit_change(dsidev, DSI_PLL_GO, 0, 0) != 0) { 15833de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("dsi pll go bit not going down.\n"); 15843de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = -EIO; 15853de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen goto err; 15863de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 15873de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1588a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja if (wait_for_bit_change(dsidev, DSI_PLL_STATUS, 1, 1) != 1) { 15893de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("cannot lock PLL\n"); 15903de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = -EIO; 15913de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen goto err; 15923de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 15933de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1594f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->pll_locked = 1; 15953de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1596a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja l = dsi_read_reg(dsidev, DSI_PLL_CONFIGURATION2); 15973de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen l = FLD_MOD(l, 0, 0, 0); /* DSI_PLL_IDLE */ 15983de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen l = FLD_MOD(l, 0, 5, 5); /* DSI_PLL_PLLLPMODE */ 15993de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen l = FLD_MOD(l, 0, 6, 6); /* DSI_PLL_LOWCURRSTBY */ 16003de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen l = FLD_MOD(l, 0, 7, 7); /* DSI_PLL_TIGHTPHASELOCK */ 16013de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen l = FLD_MOD(l, 0, 8, 8); /* DSI_PLL_DRIFTGUARDEN */ 16023de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen l = FLD_MOD(l, 0, 10, 9); /* DSI_PLL_LOCKSEL */ 16033de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen l = FLD_MOD(l, 1, 13, 13); /* DSI_PLL_REFEN */ 16043de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen l = FLD_MOD(l, 1, 14, 14); /* DSIPHY_CLKINEN */ 16053de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen l = FLD_MOD(l, 0, 15, 15); /* DSI_BYPASSEN */ 16063de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen l = FLD_MOD(l, 1, 16, 16); /* DSS_CLOCK_EN */ 16073de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen l = FLD_MOD(l, 0, 17, 17); /* DSS_CLOCK_PWDN */ 16083de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen l = FLD_MOD(l, 1, 18, 18); /* DSI_PROTO_CLOCK_EN */ 16093de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen l = FLD_MOD(l, 0, 19, 19); /* DSI_PROTO_CLOCK_PWDN */ 16103de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen l = FLD_MOD(l, 0, 20, 20); /* DSI_HSDIVBYPASS */ 1611a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_write_reg(dsidev, DSI_PLL_CONFIGURATION2, l); 16123de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 16133de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("PLL config done\n"); 16143de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinenerr: 16153de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return r; 16163de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 16173de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1618a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejaint dsi_pll_init(struct platform_device *dsidev, bool enable_hsclk, 1619a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja bool enable_hsdiv) 16203de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 1621f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 16223de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen int r = 0; 16233de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen enum dsi_pll_power_state pwstate; 16243de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 16253de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("PLL init\n"); 16263de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1627f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (dsi->vdds_dsi_reg == NULL) { 1628f2988ab9f4a2bf5e24f37d20eab1aad6862953d3Tomi Valkeinen struct regulator *vdds_dsi; 1629f2988ab9f4a2bf5e24f37d20eab1aad6862953d3Tomi Valkeinen 1630f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja vdds_dsi = regulator_get(&dsi->pdev->dev, "vdds_dsi"); 1631f2988ab9f4a2bf5e24f37d20eab1aad6862953d3Tomi Valkeinen 1632f2988ab9f4a2bf5e24f37d20eab1aad6862953d3Tomi Valkeinen if (IS_ERR(vdds_dsi)) { 1633f2988ab9f4a2bf5e24f37d20eab1aad6862953d3Tomi Valkeinen DSSERR("can't get VDDS_DSI regulator\n"); 1634f2988ab9f4a2bf5e24f37d20eab1aad6862953d3Tomi Valkeinen return PTR_ERR(vdds_dsi); 1635f2988ab9f4a2bf5e24f37d20eab1aad6862953d3Tomi Valkeinen } 1636f2988ab9f4a2bf5e24f37d20eab1aad6862953d3Tomi Valkeinen 1637f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->vdds_dsi_reg = vdds_dsi; 1638f2988ab9f4a2bf5e24f37d20eab1aad6862953d3Tomi Valkeinen } 1639f2988ab9f4a2bf5e24f37d20eab1aad6862953d3Tomi Valkeinen 1640a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_enable_pll_clock(dsidev, 1); 164124c1ae4191e911caa08b31079d61ff4db319a101Tomi Valkeinen /* 164224c1ae4191e911caa08b31079d61ff4db319a101Tomi Valkeinen * Note: SCP CLK is not required on OMAP3, but it is required on OMAP4. 164324c1ae4191e911caa08b31079d61ff4db319a101Tomi Valkeinen */ 1644a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_enable_scp_clk(dsidev); 16453de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1646f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (!dsi->vdds_dsi_enabled) { 1647f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja r = regulator_enable(dsi->vdds_dsi_reg); 16482a89dc15331983621b772240ebef9dea2cbe5322Tomi Valkeinen if (r) 16492a89dc15331983621b772240ebef9dea2cbe5322Tomi Valkeinen goto err0; 1650f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->vdds_dsi_enabled = true; 16512a89dc15331983621b772240ebef9dea2cbe5322Tomi Valkeinen } 16523de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 16533de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* XXX PLL does not come out of reset without this... */ 16543de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen dispc_pck_free_enable(1); 16553de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1656a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja if (wait_for_bit_change(dsidev, DSI_PLL_STATUS, 0, 1) != 1) { 16573de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("PLL not coming out of reset.\n"); 16583de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = -ENODEV; 1659481dfa0eb915fb248c93ea37cd6e669b91ee9f8eVille Syrjälä dispc_pck_free_enable(0); 16603de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen goto err1; 16613de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 16623de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 16633de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* XXX ... but if left on, we get problems when planes do not 16643de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen * fill the whole display. No idea about this */ 16653de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen dispc_pck_free_enable(0); 16663de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 16673de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (enable_hsclk && enable_hsdiv) 16683de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen pwstate = DSI_PLL_POWER_ON_ALL; 16693de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen else if (enable_hsclk) 16703de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen pwstate = DSI_PLL_POWER_ON_HSCLK; 16713de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen else if (enable_hsdiv) 16723de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen pwstate = DSI_PLL_POWER_ON_DIV; 16733de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen else 16743de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen pwstate = DSI_PLL_POWER_OFF; 16753de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1676a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja r = dsi_pll_power(dsidev, pwstate); 16773de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 16783de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (r) 16793de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen goto err1; 16803de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 16813de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("PLL init done\n"); 16823de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 16833de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return 0; 16843de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinenerr1: 1685f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (dsi->vdds_dsi_enabled) { 1686f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja regulator_disable(dsi->vdds_dsi_reg); 1687f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->vdds_dsi_enabled = false; 16882a89dc15331983621b772240ebef9dea2cbe5322Tomi Valkeinen } 16893de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinenerr0: 1690a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_disable_scp_clk(dsidev); 1691a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_enable_pll_clock(dsidev, 0); 16923de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return r; 16933de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 16943de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1695a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejavoid dsi_pll_uninit(struct platform_device *dsidev, bool disconnect_lanes) 16963de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 1697f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 1698f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 1699f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->pll_locked = 0; 1700a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_pll_power(dsidev, DSI_PLL_POWER_OFF); 17012a89dc15331983621b772240ebef9dea2cbe5322Tomi Valkeinen if (disconnect_lanes) { 1702f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja WARN_ON(!dsi->vdds_dsi_enabled); 1703f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja regulator_disable(dsi->vdds_dsi_reg); 1704f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->vdds_dsi_enabled = false; 17052a89dc15331983621b772240ebef9dea2cbe5322Tomi Valkeinen } 170624c1ae4191e911caa08b31079d61ff4db319a101Tomi Valkeinen 1707a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_disable_scp_clk(dsidev); 1708a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_enable_pll_clock(dsidev, 0); 170924c1ae4191e911caa08b31079d61ff4db319a101Tomi Valkeinen 17103de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("PLL uninit done\n"); 17113de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 17123de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 17135a8b572d832772722c3b3b7578e7fb968560fcf3Archit Tanejastatic void dsi_dump_dsidev_clocks(struct platform_device *dsidev, 17145a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja struct seq_file *s) 17153de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 1716f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 1717f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_clock_info *cinfo = &dsi->current_cinfo; 171889a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja enum omap_dss_clk_source dispc_clk_src, dsi_clk_src; 17195a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja int dsi_module = dsi_get_dsidev_id(dsidev); 1720067a57e48e302863eb2d5ac0900ae9ae65dbc8c3Archit Taneja 1721067a57e48e302863eb2d5ac0900ae9ae65dbc8c3Archit Taneja dispc_clk_src = dss_get_dispc_clk_source(); 17225a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja dsi_clk_src = dss_get_dsi_clk_source(dsi_module); 17233de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 17244fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen if (dsi_runtime_get(dsidev)) 17254fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen return; 17263de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 17275a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja seq_printf(s, "- DSI%d PLL -\n", dsi_module + 1); 17283de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 17293de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen seq_printf(s, "dsi pll source = %s\n", 1730a9a6500b718a38d4658b8a61edd8fc3aa0418b50Tomi Valkeinen cinfo->use_sys_clk ? "dss_sys_clk" : "pclkfree"); 17313de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 17323de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen seq_printf(s, "Fint\t\t%-16luregn %u\n", cinfo->fint, cinfo->regn); 17333de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 17343de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen seq_printf(s, "CLKIN4DDR\t%-16luregm %u\n", 17353de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen cinfo->clkin4ddr, cinfo->regm); 17363de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 173784309f16323b433045fba250f1e6bf8f26847ca5Archit Taneja seq_printf(s, "DSI_PLL_HSDIV_DISPC (%s)\t%-16luregm_dispc %u\t(%s)\n", 173884309f16323b433045fba250f1e6bf8f26847ca5Archit Taneja dss_feat_get_clk_source_name(dsi_module == 0 ? 173984309f16323b433045fba250f1e6bf8f26847ca5Archit Taneja OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC : 174084309f16323b433045fba250f1e6bf8f26847ca5Archit Taneja OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DISPC), 17411bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja cinfo->dsi_pll_hsdiv_dispc_clk, 17421bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja cinfo->regm_dispc, 174389a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja dispc_clk_src == OMAP_DSS_CLK_SRC_FCK ? 174463cf28ac3e3166a02a4e0db6168cf403ed66e3a5Tomi Valkeinen "off" : "on"); 17453de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 174684309f16323b433045fba250f1e6bf8f26847ca5Archit Taneja seq_printf(s, "DSI_PLL_HSDIV_DSI (%s)\t%-16luregm_dsi %u\t(%s)\n", 174784309f16323b433045fba250f1e6bf8f26847ca5Archit Taneja dss_feat_get_clk_source_name(dsi_module == 0 ? 174884309f16323b433045fba250f1e6bf8f26847ca5Archit Taneja OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DSI : 174984309f16323b433045fba250f1e6bf8f26847ca5Archit Taneja OMAP_DSS_CLK_SRC_DSI2_PLL_HSDIV_DSI), 17501bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja cinfo->dsi_pll_hsdiv_dsi_clk, 17511bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja cinfo->regm_dsi, 175289a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja dsi_clk_src == OMAP_DSS_CLK_SRC_FCK ? 175363cf28ac3e3166a02a4e0db6168cf403ed66e3a5Tomi Valkeinen "off" : "on"); 17543de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 17555a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja seq_printf(s, "- DSI%d -\n", dsi_module + 1); 17563de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1757067a57e48e302863eb2d5ac0900ae9ae65dbc8c3Archit Taneja seq_printf(s, "dsi fclk source = %s (%s)\n", 1758067a57e48e302863eb2d5ac0900ae9ae65dbc8c3Archit Taneja dss_get_generic_clk_source_name(dsi_clk_src), 1759067a57e48e302863eb2d5ac0900ae9ae65dbc8c3Archit Taneja dss_feat_get_clk_source_name(dsi_clk_src)); 17603de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1761a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja seq_printf(s, "DSI_FCLK\t%lu\n", dsi_fclk_rate(dsidev)); 17623de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 17633de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen seq_printf(s, "DDR_CLK\t\t%lu\n", 17643de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen cinfo->clkin4ddr / 4); 17653de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1766a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja seq_printf(s, "TxByteClkHS\t%lu\n", dsi_get_txbyteclkhs(dsidev)); 17673de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 17683de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen seq_printf(s, "LP_CLK\t\t%lu\n", cinfo->lp_clk); 17693de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 17704fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dsi_runtime_put(dsidev); 17713de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 17723de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 17735a8b572d832772722c3b3b7578e7fb968560fcf3Archit Tanejavoid dsi_dump_clocks(struct seq_file *s) 17745a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja{ 17755a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja struct platform_device *dsidev; 17765a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja int i; 17775a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja 17785a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja for (i = 0; i < MAX_NUM_DSI; i++) { 17795a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja dsidev = dsi_get_dsidev_from_id(i); 17805a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja if (dsidev) 17815a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja dsi_dump_dsidev_clocks(dsidev, s); 17825a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja } 17835a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja} 17845a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja 1785dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS 17865a8b572d832772722c3b3b7578e7fb968560fcf3Archit Tanejastatic void dsi_dump_dsidev_irqs(struct platform_device *dsidev, 17875a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja struct seq_file *s) 1788dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen{ 1789f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 1790dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen unsigned long flags; 1791dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen struct dsi_irq_stats stats; 17925a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja int dsi_module = dsi_get_dsidev_id(dsidev); 1793dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 1794f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja spin_lock_irqsave(&dsi->irq_stats_lock, flags); 1795dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 1796f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja stats = dsi->irq_stats; 1797f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja memset(&dsi->irq_stats, 0, sizeof(dsi->irq_stats)); 1798f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->irq_stats.last_reset = jiffies; 1799dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 1800f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja spin_unlock_irqrestore(&dsi->irq_stats_lock, flags); 1801dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 1802dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen seq_printf(s, "period %u ms\n", 1803dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen jiffies_to_msecs(jiffies - stats.last_reset)); 1804dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 1805dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen seq_printf(s, "irqs %d\n", stats.irq_count); 1806dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#define PIS(x) \ 1807dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen seq_printf(s, "%-20s %10d\n", #x, stats.dsi_irqs[ffs(DSI_IRQ_##x)-1]); 1808dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 18095a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja seq_printf(s, "-- DSI%d interrupts --\n", dsi_module + 1); 1810dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(VC0); 1811dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(VC1); 1812dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(VC2); 1813dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(VC3); 1814dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(WAKEUP); 1815dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(RESYNC); 1816dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(PLL_LOCK); 1817dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(PLL_UNLOCK); 1818dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(PLL_RECALL); 1819dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(COMPLEXIO_ERR); 1820dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(HS_TX_TIMEOUT); 1821dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(LP_RX_TIMEOUT); 1822dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(TE_TRIGGER); 1823dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(ACK_TRIGGER); 1824dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(SYNC_LOST); 1825dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(LDO_POWER_GOOD); 1826dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(TA_TIMEOUT); 1827dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#undef PIS 1828dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 1829dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#define PIS(x) \ 1830dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen seq_printf(s, "%-20s %10d %10d %10d %10d\n", #x, \ 1831dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen stats.vc_irqs[0][ffs(DSI_VC_IRQ_##x)-1], \ 1832dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen stats.vc_irqs[1][ffs(DSI_VC_IRQ_##x)-1], \ 1833dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen stats.vc_irqs[2][ffs(DSI_VC_IRQ_##x)-1], \ 1834dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen stats.vc_irqs[3][ffs(DSI_VC_IRQ_##x)-1]); 1835dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 1836dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen seq_printf(s, "-- VC interrupts --\n"); 1837dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(CS); 1838dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(ECC_CORR); 1839dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(PACKET_SENT); 1840dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(FIFO_TX_OVF); 1841dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(FIFO_RX_OVF); 1842dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(BTA); 1843dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(ECC_NO_CORR); 1844dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(FIFO_TX_UDF); 1845dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(PP_BUSY_CHANGE); 1846dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#undef PIS 1847dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 1848dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#define PIS(x) \ 1849dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen seq_printf(s, "%-20s %10d\n", #x, \ 1850dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen stats.cio_irqs[ffs(DSI_CIO_IRQ_##x)-1]); 1851dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 1852dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen seq_printf(s, "-- CIO interrupts --\n"); 1853dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(ERRSYNCESC1); 1854dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(ERRSYNCESC2); 1855dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(ERRSYNCESC3); 1856dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(ERRESC1); 1857dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(ERRESC2); 1858dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(ERRESC3); 1859dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(ERRCONTROL1); 1860dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(ERRCONTROL2); 1861dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(ERRCONTROL3); 1862dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(STATEULPS1); 1863dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(STATEULPS2); 1864dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(STATEULPS3); 1865dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(ERRCONTENTIONLP0_1); 1866dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(ERRCONTENTIONLP1_1); 1867dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(ERRCONTENTIONLP0_2); 1868dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(ERRCONTENTIONLP1_2); 1869dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(ERRCONTENTIONLP0_3); 1870dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(ERRCONTENTIONLP1_3); 1871dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(ULPSACTIVENOT_ALL0); 1872dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen PIS(ULPSACTIVENOT_ALL1); 1873dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#undef PIS 1874dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen} 1875dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 18765a8b572d832772722c3b3b7578e7fb968560fcf3Archit Tanejastatic void dsi1_dump_irqs(struct seq_file *s) 18773de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 1878a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_id(0); 1879a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja 18805a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja dsi_dump_dsidev_irqs(dsidev, s); 18815a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja} 18825a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja 18835a8b572d832772722c3b3b7578e7fb968560fcf3Archit Tanejastatic void dsi2_dump_irqs(struct seq_file *s) 18845a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja{ 18855a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_id(1); 18865a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja 18875a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja dsi_dump_dsidev_irqs(dsidev, s); 18885a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja} 18895a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja 18905a8b572d832772722c3b3b7578e7fb968560fcf3Archit Tanejavoid dsi_create_debugfs_files_irq(struct dentry *debugfs_dir, 18915a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja const struct file_operations *debug_fops) 18925a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja{ 18935a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja struct platform_device *dsidev; 18945a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja 18955a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja dsidev = dsi_get_dsidev_from_id(0); 18965a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja if (dsidev) 18975a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja debugfs_create_file("dsi1_irqs", S_IRUGO, debugfs_dir, 18985a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja &dsi1_dump_irqs, debug_fops); 18995a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja 19005a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja dsidev = dsi_get_dsidev_from_id(1); 19015a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja if (dsidev) 19025a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja debugfs_create_file("dsi2_irqs", S_IRUGO, debugfs_dir, 19035a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja &dsi2_dump_irqs, debug_fops); 19045a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja} 19055a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja#endif 19065a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja 19075a8b572d832772722c3b3b7578e7fb968560fcf3Archit Tanejastatic void dsi_dump_dsidev_regs(struct platform_device *dsidev, 19085a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja struct seq_file *s) 19095a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja{ 1910a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja#define DUMPREG(r) seq_printf(s, "%-35s %08x\n", #r, dsi_read_reg(dsidev, r)) 19113de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 19124fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen if (dsi_runtime_get(dsidev)) 19134fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen return; 1914a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_enable_scp_clk(dsidev); 19153de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 19163de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_REVISION); 19173de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_SYSCONFIG); 19183de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_SYSSTATUS); 19193de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_IRQSTATUS); 19203de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_IRQENABLE); 19213de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_CTRL); 19223de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_COMPLEXIO_CFG1); 19233de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_COMPLEXIO_IRQ_STATUS); 19243de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_COMPLEXIO_IRQ_ENABLE); 19253de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_CLK_CTRL); 19263de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_TIMING1); 19273de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_TIMING2); 19283de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VM_TIMING1); 19293de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VM_TIMING2); 19303de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VM_TIMING3); 19313de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_CLK_TIMING); 19323de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_TX_FIFO_VC_SIZE); 19333de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_RX_FIFO_VC_SIZE); 19343de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_COMPLEXIO_CFG2); 19353de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_RX_FIFO_VC_FULLNESS); 19363de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VM_TIMING4); 19373de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_TX_FIFO_VC_EMPTINESS); 19383de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VM_TIMING5); 19393de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VM_TIMING6); 19403de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VM_TIMING7); 19413de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_STOPCLK_TIMING); 19423de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 19433de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VC_CTRL(0)); 19443de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VC_TE(0)); 19453de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VC_LONG_PACKET_HEADER(0)); 19463de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VC_LONG_PACKET_PAYLOAD(0)); 19473de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VC_SHORT_PACKET_HEADER(0)); 19483de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VC_IRQSTATUS(0)); 19493de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VC_IRQENABLE(0)); 19503de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 19513de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VC_CTRL(1)); 19523de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VC_TE(1)); 19533de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VC_LONG_PACKET_HEADER(1)); 19543de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VC_LONG_PACKET_PAYLOAD(1)); 19553de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VC_SHORT_PACKET_HEADER(1)); 19563de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VC_IRQSTATUS(1)); 19573de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VC_IRQENABLE(1)); 19583de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 19593de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VC_CTRL(2)); 19603de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VC_TE(2)); 19613de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VC_LONG_PACKET_HEADER(2)); 19623de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VC_LONG_PACKET_PAYLOAD(2)); 19633de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VC_SHORT_PACKET_HEADER(2)); 19643de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VC_IRQSTATUS(2)); 19653de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VC_IRQENABLE(2)); 19663de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 19673de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VC_CTRL(3)); 19683de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VC_TE(3)); 19693de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VC_LONG_PACKET_HEADER(3)); 19703de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VC_LONG_PACKET_PAYLOAD(3)); 19713de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VC_SHORT_PACKET_HEADER(3)); 19723de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VC_IRQSTATUS(3)); 19733de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_VC_IRQENABLE(3)); 19743de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 19753de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_DSIPHY_CFG0); 19763de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_DSIPHY_CFG1); 19773de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_DSIPHY_CFG2); 19783de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_DSIPHY_CFG5); 19793de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 19803de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_PLL_CONTROL); 19813de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_PLL_STATUS); 19823de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_PLL_GO); 19833de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_PLL_CONFIGURATION1); 19843de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DUMPREG(DSI_PLL_CONFIGURATION2); 19853de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 1986a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_disable_scp_clk(dsidev); 19874fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dsi_runtime_put(dsidev); 19883de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#undef DUMPREG 19893de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 19903de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 19915a8b572d832772722c3b3b7578e7fb968560fcf3Archit Tanejastatic void dsi1_dump_regs(struct seq_file *s) 19925a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja{ 19935a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_id(0); 19945a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja 19955a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja dsi_dump_dsidev_regs(dsidev, s); 19965a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja} 19975a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja 19985a8b572d832772722c3b3b7578e7fb968560fcf3Archit Tanejastatic void dsi2_dump_regs(struct seq_file *s) 19995a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja{ 20005a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_id(1); 20015a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja 20025a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja dsi_dump_dsidev_regs(dsidev, s); 20035a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja} 20045a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja 20055a8b572d832772722c3b3b7578e7fb968560fcf3Archit Tanejavoid dsi_create_debugfs_files_reg(struct dentry *debugfs_dir, 20065a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja const struct file_operations *debug_fops) 20075a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja{ 20085a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja struct platform_device *dsidev; 20095a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja 20105a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja dsidev = dsi_get_dsidev_from_id(0); 20115a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja if (dsidev) 20125a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja debugfs_create_file("dsi1_regs", S_IRUGO, debugfs_dir, 20135a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja &dsi1_dump_regs, debug_fops); 20145a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja 20155a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja dsidev = dsi_get_dsidev_from_id(1); 20165a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja if (dsidev) 20175a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja debugfs_create_file("dsi2_regs", S_IRUGO, debugfs_dir, 20185a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja &dsi2_dump_regs, debug_fops); 20195a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja} 2020cc5c185098d85d709cc2a542c40abff0b337e094Tomi Valkeinenenum dsi_cio_power_state { 20213de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSI_COMPLEXIO_POWER_OFF = 0x0, 20223de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSI_COMPLEXIO_POWER_ON = 0x1, 20233de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSI_COMPLEXIO_POWER_ULPS = 0x2, 20243de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen}; 20253de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2026a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic int dsi_cio_power(struct platform_device *dsidev, 2027a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja enum dsi_cio_power_state state) 20283de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 20293de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen int t = 0; 20303de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 20313de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* PWR_CMD */ 2032a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja REG_FLD_MOD(dsidev, DSI_COMPLEXIO_CFG1, state, 28, 27); 20333de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 20343de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* PWR_STATUS */ 2035a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja while (FLD_GET(dsi_read_reg(dsidev, DSI_COMPLEXIO_CFG1), 2036a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja 26, 25) != state) { 203724be78b32f0a6e14aead3eac89d768a361b091b3Tomi Valkeinen if (++t > 1000) { 20383de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("failed to set complexio power state to " 20393de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen "%d\n", state); 20403de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return -ENODEV; 20413de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 204224be78b32f0a6e14aead3eac89d768a361b091b3Tomi Valkeinen udelay(1); 20433de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 20443de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 20453de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return 0; 20463de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 20473de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 20480c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Tanejastatic unsigned dsi_get_line_buf_size(struct platform_device *dsidev) 20490c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja{ 20500c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja int val; 20510c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja 20520c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja /* line buffer on OMAP3 is 1024 x 24bits */ 20530c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja /* XXX: for some reason using full buffer size causes 20540c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja * considerable TX slowdown with update sizes that fill the 20550c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja * whole buffer */ 20560c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja if (!dss_has_feature(FEAT_DSI_GNQ)) 20570c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja return 1023 * 3; 20580c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja 20590c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja val = REG_GET(dsidev, DSI_GNQ, 14, 12); /* VP1_LINE_BUFFER_SIZE */ 20600c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja 20610c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja switch (val) { 20620c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja case 1: 20630c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja return 512 * 3; /* 512x24 bits */ 20640c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja case 2: 20650c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja return 682 * 3; /* 682x24 bits */ 20660c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja case 3: 20670c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja return 853 * 3; /* 853x24 bits */ 20680c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja case 4: 20690c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja return 1024 * 3; /* 1024x24 bits */ 20700c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja case 5: 20710c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja return 1194 * 3; /* 1194x24 bits */ 20720c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja case 6: 20730c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja return 1365 * 3; /* 1365x24 bits */ 20740c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja default: 20750c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja BUG(); 20760c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja } 20770c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja} 20780c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja 2079739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinenstatic int dsi_parse_lane_config(struct omap_dss_device *dssdev) 20803de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 2081a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 2082739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 2083739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen u8 lanes[DSI_MAX_NR_LANES]; 2084739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen u8 polarities[DSI_MAX_NR_LANES]; 2085739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen int num_lanes, i; 2086739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen 2087739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen static const enum dsi_lane_function functions[] = { 2088739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen DSI_LANE_CLK, 2089739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen DSI_LANE_DATA1, 2090739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen DSI_LANE_DATA2, 2091739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen DSI_LANE_DATA3, 2092739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen DSI_LANE_DATA4, 2093739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen }; 2094739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen 2095739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen lanes[0] = dssdev->phy.dsi.clk_lane; 2096739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen lanes[1] = dssdev->phy.dsi.data1_lane; 2097739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen lanes[2] = dssdev->phy.dsi.data2_lane; 2098739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen lanes[3] = dssdev->phy.dsi.data3_lane; 2099739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen lanes[4] = dssdev->phy.dsi.data4_lane; 2100739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen polarities[0] = dssdev->phy.dsi.clk_pol; 2101739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen polarities[1] = dssdev->phy.dsi.data1_pol; 2102739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen polarities[2] = dssdev->phy.dsi.data2_pol; 2103739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen polarities[3] = dssdev->phy.dsi.data3_pol; 2104739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen polarities[4] = dssdev->phy.dsi.data4_pol; 21053de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2106739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen num_lanes = 0; 2107739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen 2108739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen for (i = 0; i < dsi->num_lanes_supported; ++i) 2109739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen dsi->lanes[i].function = DSI_LANE_UNUSED; 2110739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen 2111739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen for (i = 0; i < dsi->num_lanes_supported; ++i) { 2112739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen int num; 2113739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen 2114739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen if (lanes[i] == DSI_LANE_UNUSED) 2115739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen break; 2116739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen 2117739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen num = lanes[i] - 1; 2118739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen 2119739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen if (num >= dsi->num_lanes_supported) 2120739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen return -EINVAL; 2121739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen 2122739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen if (dsi->lanes[num].function != DSI_LANE_UNUSED) 2123739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen return -EINVAL; 2124739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen 2125739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen dsi->lanes[num].function = functions[i]; 2126739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen dsi->lanes[num].polarity = polarities[i]; 2127739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen num_lanes++; 2128739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen } 2129739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen 2130739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen if (num_lanes < 2 || num_lanes > dsi->num_lanes_supported) 2131739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen return -EINVAL; 2132739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen 2133739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen dsi->num_lanes_used = num_lanes; 2134739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen 2135739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen return 0; 2136739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen} 2137739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen 213848368395f670ac8cc60288674de940a38693412eTomi Valkeinenstatic int dsi_set_lane_config(struct omap_dss_device *dssdev) 21393de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 2140a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 214148368395f670ac8cc60288674de940a38693412eTomi Valkeinen struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 214248368395f670ac8cc60288674de940a38693412eTomi Valkeinen static const u8 offsets[] = { 0, 4, 8, 12, 16 }; 214348368395f670ac8cc60288674de940a38693412eTomi Valkeinen static const enum dsi_lane_function functions[] = { 214448368395f670ac8cc60288674de940a38693412eTomi Valkeinen DSI_LANE_CLK, 214548368395f670ac8cc60288674de940a38693412eTomi Valkeinen DSI_LANE_DATA1, 214648368395f670ac8cc60288674de940a38693412eTomi Valkeinen DSI_LANE_DATA2, 214748368395f670ac8cc60288674de940a38693412eTomi Valkeinen DSI_LANE_DATA3, 214848368395f670ac8cc60288674de940a38693412eTomi Valkeinen DSI_LANE_DATA4, 214948368395f670ac8cc60288674de940a38693412eTomi Valkeinen }; 21503de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u32 r; 215148368395f670ac8cc60288674de940a38693412eTomi Valkeinen int i; 21523de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2153a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja r = dsi_read_reg(dsidev, DSI_COMPLEXIO_CFG1); 215448368395f670ac8cc60288674de940a38693412eTomi Valkeinen 215548368395f670ac8cc60288674de940a38693412eTomi Valkeinen for (i = 0; i < dsi->num_lanes_used; ++i) { 215648368395f670ac8cc60288674de940a38693412eTomi Valkeinen unsigned offset = offsets[i]; 215748368395f670ac8cc60288674de940a38693412eTomi Valkeinen unsigned polarity, lane_number; 215848368395f670ac8cc60288674de940a38693412eTomi Valkeinen unsigned t; 215948368395f670ac8cc60288674de940a38693412eTomi Valkeinen 216048368395f670ac8cc60288674de940a38693412eTomi Valkeinen for (t = 0; t < dsi->num_lanes_supported; ++t) 216148368395f670ac8cc60288674de940a38693412eTomi Valkeinen if (dsi->lanes[t].function == functions[i]) 216248368395f670ac8cc60288674de940a38693412eTomi Valkeinen break; 216348368395f670ac8cc60288674de940a38693412eTomi Valkeinen 216448368395f670ac8cc60288674de940a38693412eTomi Valkeinen if (t == dsi->num_lanes_supported) 216548368395f670ac8cc60288674de940a38693412eTomi Valkeinen return -EINVAL; 216648368395f670ac8cc60288674de940a38693412eTomi Valkeinen 216748368395f670ac8cc60288674de940a38693412eTomi Valkeinen lane_number = t; 216848368395f670ac8cc60288674de940a38693412eTomi Valkeinen polarity = dsi->lanes[t].polarity; 216948368395f670ac8cc60288674de940a38693412eTomi Valkeinen 217048368395f670ac8cc60288674de940a38693412eTomi Valkeinen r = FLD_MOD(r, lane_number + 1, offset + 2, offset); 217148368395f670ac8cc60288674de940a38693412eTomi Valkeinen r = FLD_MOD(r, polarity, offset + 3, offset + 3); 217275d7247c07d27d046323504e2dbca5b3e94fbeceArchit Taneja } 217375d7247c07d27d046323504e2dbca5b3e94fbeceArchit Taneja 217448368395f670ac8cc60288674de940a38693412eTomi Valkeinen /* clear the unused lanes */ 217548368395f670ac8cc60288674de940a38693412eTomi Valkeinen for (; i < dsi->num_lanes_supported; ++i) { 217648368395f670ac8cc60288674de940a38693412eTomi Valkeinen unsigned offset = offsets[i]; 217748368395f670ac8cc60288674de940a38693412eTomi Valkeinen 217848368395f670ac8cc60288674de940a38693412eTomi Valkeinen r = FLD_MOD(r, 0, offset + 2, offset); 217948368395f670ac8cc60288674de940a38693412eTomi Valkeinen r = FLD_MOD(r, 0, offset + 3, offset + 3); 218075d7247c07d27d046323504e2dbca5b3e94fbeceArchit Taneja } 21813de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 218248368395f670ac8cc60288674de940a38693412eTomi Valkeinen dsi_write_reg(dsidev, DSI_COMPLEXIO_CFG1, r); 21833de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 218448368395f670ac8cc60288674de940a38693412eTomi Valkeinen return 0; 21853de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 21863de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2187a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic inline unsigned ns2ddr(struct platform_device *dsidev, unsigned ns) 21883de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 2189f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 2190f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 21913de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* convert time in ns to ddr ticks, rounding up */ 2192f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja unsigned long ddr_clk = dsi->current_cinfo.clkin4ddr / 4; 21933de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return (ns * (ddr_clk / 1000 / 1000) + 999) / 1000; 21943de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 21953de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2196a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic inline unsigned ddr2ns(struct platform_device *dsidev, unsigned ddr) 21973de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 2198f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 2199f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 2200f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja unsigned long ddr_clk = dsi->current_cinfo.clkin4ddr / 4; 22013de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return ddr * 1000 * 1000 / (ddr_clk / 1000); 22023de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 22033de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2204a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic void dsi_cio_timings(struct platform_device *dsidev) 22053de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 22063de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u32 r; 22073de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u32 ths_prepare, ths_prepare_ths_zero, ths_trail, ths_exit; 22083de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u32 tlpx_half, tclk_trail, tclk_zero; 22093de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u32 tclk_prepare; 22103de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 22113de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* calculate timings */ 22123de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 22133de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* 1 * DDR_CLK = 2 * UI */ 22143de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 22153de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* min 40ns + 4*UI max 85ns + 6*UI */ 2216a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja ths_prepare = ns2ddr(dsidev, 70) + 2; 22173de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 22183de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* min 145ns + 10*UI */ 2219a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja ths_prepare_ths_zero = ns2ddr(dsidev, 175) + 2; 22203de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 22213de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* min max(8*UI, 60ns+4*UI) */ 2222a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja ths_trail = ns2ddr(dsidev, 60) + 5; 22233de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 22243de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* min 100ns */ 2225a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja ths_exit = ns2ddr(dsidev, 145); 22263de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 22273de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* tlpx min 50n */ 2228a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja tlpx_half = ns2ddr(dsidev, 25); 22293de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 22303de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* min 60ns */ 2231a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja tclk_trail = ns2ddr(dsidev, 60) + 2; 22323de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 22333de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* min 38ns, max 95ns */ 2234a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja tclk_prepare = ns2ddr(dsidev, 65); 22353de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 22363de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* min tclk-prepare + tclk-zero = 300ns */ 2237a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja tclk_zero = ns2ddr(dsidev, 260); 22383de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 22393de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("ths_prepare %u (%uns), ths_prepare_ths_zero %u (%uns)\n", 2240a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja ths_prepare, ddr2ns(dsidev, ths_prepare), 2241a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja ths_prepare_ths_zero, ddr2ns(dsidev, ths_prepare_ths_zero)); 22423de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("ths_trail %u (%uns), ths_exit %u (%uns)\n", 2243a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja ths_trail, ddr2ns(dsidev, ths_trail), 2244a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja ths_exit, ddr2ns(dsidev, ths_exit)); 22453de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 22463de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("tlpx_half %u (%uns), tclk_trail %u (%uns), " 22473de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen "tclk_zero %u (%uns)\n", 2248a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja tlpx_half, ddr2ns(dsidev, tlpx_half), 2249a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja tclk_trail, ddr2ns(dsidev, tclk_trail), 2250a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja tclk_zero, ddr2ns(dsidev, tclk_zero)); 22513de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("tclk_prepare %u (%uns)\n", 2252a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja tclk_prepare, ddr2ns(dsidev, tclk_prepare)); 22533de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 22543de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* program timings */ 22553de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2256a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja r = dsi_read_reg(dsidev, DSI_DSIPHY_CFG0); 22573de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, ths_prepare, 31, 24); 22583de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, ths_prepare_ths_zero, 23, 16); 22593de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, ths_trail, 15, 8); 22603de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, ths_exit, 7, 0); 2261a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_write_reg(dsidev, DSI_DSIPHY_CFG0, r); 22623de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2263a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja r = dsi_read_reg(dsidev, DSI_DSIPHY_CFG1); 22643de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, tlpx_half, 22, 16); 22653de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, tclk_trail, 15, 8); 22663de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, tclk_zero, 7, 0); 2267a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_write_reg(dsidev, DSI_DSIPHY_CFG1, r); 22683de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2269a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja r = dsi_read_reg(dsidev, DSI_DSIPHY_CFG2); 22703de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, tclk_prepare, 7, 0); 2271a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_write_reg(dsidev, DSI_DSIPHY_CFG2, r); 22723de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 22733de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 22749b4362f2b5ad6d0cf6b5754000b8db80d0592e89Tomi Valkeinen/* lane masks have lane 0 at lsb. mask_p for positive lines, n for negative */ 2275cc5c185098d85d709cc2a542c40abff0b337e094Tomi Valkeinenstatic void dsi_cio_enable_lane_override(struct omap_dss_device *dssdev, 22769b4362f2b5ad6d0cf6b5754000b8db80d0592e89Tomi Valkeinen unsigned mask_p, unsigned mask_n) 22770a0ee46b1ae05862cb05ec43caffc01c5259c4ccTomi Valkeinen{ 2278a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 227975d7247c07d27d046323504e2dbca5b3e94fbeceArchit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 22809b4362f2b5ad6d0cf6b5754000b8db80d0592e89Tomi Valkeinen int i; 22819b4362f2b5ad6d0cf6b5754000b8db80d0592e89Tomi Valkeinen u32 l; 2282d982085050e67da24a57ec04eb3701eb4805118aTomi Valkeinen u8 lptxscp_start = dsi->num_lanes_supported == 3 ? 22 : 26; 22830a0ee46b1ae05862cb05ec43caffc01c5259c4ccTomi Valkeinen 22849b4362f2b5ad6d0cf6b5754000b8db80d0592e89Tomi Valkeinen l = 0; 22859b4362f2b5ad6d0cf6b5754000b8db80d0592e89Tomi Valkeinen 22869b4362f2b5ad6d0cf6b5754000b8db80d0592e89Tomi Valkeinen for (i = 0; i < dsi->num_lanes_supported; ++i) { 22879b4362f2b5ad6d0cf6b5754000b8db80d0592e89Tomi Valkeinen unsigned p = dsi->lanes[i].polarity; 22889b4362f2b5ad6d0cf6b5754000b8db80d0592e89Tomi Valkeinen 22899b4362f2b5ad6d0cf6b5754000b8db80d0592e89Tomi Valkeinen if (mask_p & (1 << i)) 22909b4362f2b5ad6d0cf6b5754000b8db80d0592e89Tomi Valkeinen l |= 1 << (i * 2 + (p ? 0 : 1)); 22919b4362f2b5ad6d0cf6b5754000b8db80d0592e89Tomi Valkeinen 22929b4362f2b5ad6d0cf6b5754000b8db80d0592e89Tomi Valkeinen if (mask_n & (1 << i)) 22939b4362f2b5ad6d0cf6b5754000b8db80d0592e89Tomi Valkeinen l |= 1 << (i * 2 + (p ? 1 : 0)); 22949b4362f2b5ad6d0cf6b5754000b8db80d0592e89Tomi Valkeinen } 22959b4362f2b5ad6d0cf6b5754000b8db80d0592e89Tomi Valkeinen 22960a0ee46b1ae05862cb05ec43caffc01c5259c4ccTomi Valkeinen /* 22970a0ee46b1ae05862cb05ec43caffc01c5259c4ccTomi Valkeinen * Bits in REGLPTXSCPDAT4TO0DXDY: 22980a0ee46b1ae05862cb05ec43caffc01c5259c4ccTomi Valkeinen * 17: DY0 18: DX0 22990a0ee46b1ae05862cb05ec43caffc01c5259c4ccTomi Valkeinen * 19: DY1 20: DX1 23000a0ee46b1ae05862cb05ec43caffc01c5259c4ccTomi Valkeinen * 21: DY2 22: DX2 230175d7247c07d27d046323504e2dbca5b3e94fbeceArchit Taneja * 23: DY3 24: DX3 230275d7247c07d27d046323504e2dbca5b3e94fbeceArchit Taneja * 25: DY4 26: DX4 23030a0ee46b1ae05862cb05ec43caffc01c5259c4ccTomi Valkeinen */ 23040a0ee46b1ae05862cb05ec43caffc01c5259c4ccTomi Valkeinen 23050a0ee46b1ae05862cb05ec43caffc01c5259c4ccTomi Valkeinen /* Set the lane override configuration */ 2306a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja 2307a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja /* REGLPTXSCPDAT4TO0DXDY */ 230875d7247c07d27d046323504e2dbca5b3e94fbeceArchit Taneja REG_FLD_MOD(dsidev, DSI_DSIPHY_CFG10, l, lptxscp_start, 17); 23090a0ee46b1ae05862cb05ec43caffc01c5259c4ccTomi Valkeinen 23100a0ee46b1ae05862cb05ec43caffc01c5259c4ccTomi Valkeinen /* Enable lane override */ 2311a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja 2312a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja /* ENLPTXSCPDAT */ 2313a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja REG_FLD_MOD(dsidev, DSI_DSIPHY_CFG10, 1, 27, 27); 23140a0ee46b1ae05862cb05ec43caffc01c5259c4ccTomi Valkeinen} 23150a0ee46b1ae05862cb05ec43caffc01c5259c4ccTomi Valkeinen 2316a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic void dsi_cio_disable_lane_override(struct platform_device *dsidev) 23170a0ee46b1ae05862cb05ec43caffc01c5259c4ccTomi Valkeinen{ 23180a0ee46b1ae05862cb05ec43caffc01c5259c4ccTomi Valkeinen /* Disable lane override */ 2319a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja REG_FLD_MOD(dsidev, DSI_DSIPHY_CFG10, 0, 27, 27); /* ENLPTXSCPDAT */ 23200a0ee46b1ae05862cb05ec43caffc01c5259c4ccTomi Valkeinen /* Reset the lane override configuration */ 2321a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja /* REGLPTXSCPDAT4TO0DXDY */ 2322a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja REG_FLD_MOD(dsidev, DSI_DSIPHY_CFG10, 0, 22, 17); 23230a0ee46b1ae05862cb05ec43caffc01c5259c4ccTomi Valkeinen} 23243de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 232503329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinenstatic int dsi_cio_wait_tx_clk_esc_reset(struct omap_dss_device *dssdev) 232603329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen{ 2327a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 23288dc0766fcf3b84ec83aa601acabf21f2c98ca253Tomi Valkeinen struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 23298dc0766fcf3b84ec83aa601acabf21f2c98ca253Tomi Valkeinen int t, i; 23308dc0766fcf3b84ec83aa601acabf21f2c98ca253Tomi Valkeinen bool in_use[DSI_MAX_NR_LANES]; 23318dc0766fcf3b84ec83aa601acabf21f2c98ca253Tomi Valkeinen static const u8 offsets_old[] = { 28, 27, 26 }; 23328dc0766fcf3b84ec83aa601acabf21f2c98ca253Tomi Valkeinen static const u8 offsets_new[] = { 24, 25, 26, 27, 28 }; 23338dc0766fcf3b84ec83aa601acabf21f2c98ca253Tomi Valkeinen const u8 *offsets; 23348dc0766fcf3b84ec83aa601acabf21f2c98ca253Tomi Valkeinen 23358dc0766fcf3b84ec83aa601acabf21f2c98ca253Tomi Valkeinen if (dss_has_feature(FEAT_DSI_REVERSE_TXCLKESC)) 23368dc0766fcf3b84ec83aa601acabf21f2c98ca253Tomi Valkeinen offsets = offsets_old; 23378dc0766fcf3b84ec83aa601acabf21f2c98ca253Tomi Valkeinen else 23388dc0766fcf3b84ec83aa601acabf21f2c98ca253Tomi Valkeinen offsets = offsets_new; 233903329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen 23408dc0766fcf3b84ec83aa601acabf21f2c98ca253Tomi Valkeinen for (i = 0; i < dsi->num_lanes_supported; ++i) 23418dc0766fcf3b84ec83aa601acabf21f2c98ca253Tomi Valkeinen in_use[i] = dsi->lanes[i].function != DSI_LANE_UNUSED; 234203329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen 234303329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen t = 100000; 234403329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen while (true) { 234503329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen u32 l; 234603329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen int ok; 234703329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen 2348a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja l = dsi_read_reg(dsidev, DSI_DSIPHY_CFG5); 234903329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen 235003329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen ok = 0; 23518dc0766fcf3b84ec83aa601acabf21f2c98ca253Tomi Valkeinen for (i = 0; i < dsi->num_lanes_supported; ++i) { 23528dc0766fcf3b84ec83aa601acabf21f2c98ca253Tomi Valkeinen if (!in_use[i] || (l & (1 << offsets[i]))) 235303329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen ok++; 235403329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen } 235503329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen 23568dc0766fcf3b84ec83aa601acabf21f2c98ca253Tomi Valkeinen if (ok == dsi->num_lanes_supported) 235703329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen break; 235803329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen 235903329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen if (--t == 0) { 23608dc0766fcf3b84ec83aa601acabf21f2c98ca253Tomi Valkeinen for (i = 0; i < dsi->num_lanes_supported; ++i) { 23618dc0766fcf3b84ec83aa601acabf21f2c98ca253Tomi Valkeinen if (!in_use[i] || (l & (1 << offsets[i]))) 236203329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen continue; 236303329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen 236403329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen DSSERR("CIO TXCLKESC%d domain not coming " \ 236503329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen "out of reset\n", i); 236603329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen } 236703329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen return -EIO; 236803329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen } 236903329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen } 237003329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen 237103329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen return 0; 237203329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen} 237303329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen 237485f17e8e2c8d5f9266ca28f05cbc57598eddb05aTomi Valkeinen/* return bitmask of enabled lanes, lane0 being the lsb */ 23755bc416cba15f43c799fc02727c6d6887f3e35a4eTomi Valkeinenstatic unsigned dsi_get_lane_mask(struct omap_dss_device *dssdev) 23765bc416cba15f43c799fc02727c6d6887f3e35a4eTomi Valkeinen{ 237785f17e8e2c8d5f9266ca28f05cbc57598eddb05aTomi Valkeinen struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 237885f17e8e2c8d5f9266ca28f05cbc57598eddb05aTomi Valkeinen struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 237985f17e8e2c8d5f9266ca28f05cbc57598eddb05aTomi Valkeinen unsigned mask = 0; 238085f17e8e2c8d5f9266ca28f05cbc57598eddb05aTomi Valkeinen int i; 23815bc416cba15f43c799fc02727c6d6887f3e35a4eTomi Valkeinen 238285f17e8e2c8d5f9266ca28f05cbc57598eddb05aTomi Valkeinen for (i = 0; i < dsi->num_lanes_supported; ++i) { 238385f17e8e2c8d5f9266ca28f05cbc57598eddb05aTomi Valkeinen if (dsi->lanes[i].function != DSI_LANE_UNUSED) 238485f17e8e2c8d5f9266ca28f05cbc57598eddb05aTomi Valkeinen mask |= 1 << i; 238585f17e8e2c8d5f9266ca28f05cbc57598eddb05aTomi Valkeinen } 23865bc416cba15f43c799fc02727c6d6887f3e35a4eTomi Valkeinen 238785f17e8e2c8d5f9266ca28f05cbc57598eddb05aTomi Valkeinen return mask; 23885bc416cba15f43c799fc02727c6d6887f3e35a4eTomi Valkeinen} 23895bc416cba15f43c799fc02727c6d6887f3e35a4eTomi Valkeinen 2390cc5c185098d85d709cc2a542c40abff0b337e094Tomi Valkeinenstatic int dsi_cio_init(struct omap_dss_device *dssdev) 23913de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 2392a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 2393f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 239465c62bb953d216aaf0e22692e8e12e5c568a3b02Tomi Valkeinen int r; 239540885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen u32 l; 23963de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2397cc5c185098d85d709cc2a542c40abff0b337e094Tomi Valkeinen DSSDBGF(); 23983de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 23995bc416cba15f43c799fc02727c6d6887f3e35a4eTomi Valkeinen r = dsi->enable_pads(dsidev->id, dsi_get_lane_mask(dssdev)); 24005bc416cba15f43c799fc02727c6d6887f3e35a4eTomi Valkeinen if (r) 24015bc416cba15f43c799fc02727c6d6887f3e35a4eTomi Valkeinen return r; 2402d1f5857e4bc9b2620fb3e84b1dbaa0ac11b831b4Tomi Valkeinen 2403a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_enable_scp_clk(dsidev); 240440885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen 24053de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* A dummy read using the SCP interface to any DSIPHY register is 24063de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen * required after DSIPHY reset to complete the reset of the DSI complex 24073de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen * I/O. */ 2408a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_read_reg(dsidev, DSI_DSIPHY_CFG5); 24093de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2410a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja if (wait_for_bit_change(dsidev, DSI_DSIPHY_CFG5, 30, 1) != 1) { 241165c62bb953d216aaf0e22692e8e12e5c568a3b02Tomi Valkeinen DSSERR("CIO SCP Clock domain not coming out of reset.\n"); 241265c62bb953d216aaf0e22692e8e12e5c568a3b02Tomi Valkeinen r = -EIO; 241365c62bb953d216aaf0e22692e8e12e5c568a3b02Tomi Valkeinen goto err_scp_clk_dom; 24143de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 24153de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 241648368395f670ac8cc60288674de940a38693412eTomi Valkeinen r = dsi_set_lane_config(dssdev); 241748368395f670ac8cc60288674de940a38693412eTomi Valkeinen if (r) 241848368395f670ac8cc60288674de940a38693412eTomi Valkeinen goto err_scp_clk_dom; 24193de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 242040885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen /* set TX STOP MODE timer to maximum for this operation */ 2421a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja l = dsi_read_reg(dsidev, DSI_TIMING1); 242240885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen l = FLD_MOD(l, 1, 15, 15); /* FORCE_TX_STOP_MODE_IO */ 242340885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen l = FLD_MOD(l, 1, 14, 14); /* STOP_STATE_X16_IO */ 242440885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen l = FLD_MOD(l, 1, 13, 13); /* STOP_STATE_X4_IO */ 242540885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen l = FLD_MOD(l, 0x1fff, 12, 0); /* STOP_STATE_COUNTER_IO */ 2426a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_write_reg(dsidev, DSI_TIMING1, l); 242740885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen 2428f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (dsi->ulps_enabled) { 24299b4362f2b5ad6d0cf6b5754000b8db80d0592e89Tomi Valkeinen unsigned mask_p; 24309b4362f2b5ad6d0cf6b5754000b8db80d0592e89Tomi Valkeinen int i; 243175d7247c07d27d046323504e2dbca5b3e94fbeceArchit Taneja 243265c62bb953d216aaf0e22692e8e12e5c568a3b02Tomi Valkeinen DSSDBG("manual ulps exit\n"); 243365c62bb953d216aaf0e22692e8e12e5c568a3b02Tomi Valkeinen 243440885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen /* ULPS is exited by Mark-1 state for 1ms, followed by 243540885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen * stop state. DSS HW cannot do this via the normal 243640885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen * ULPS exit sequence, as after reset the DSS HW thinks 243740885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen * that we are not in ULPS mode, and refuses to send the 243840885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen * sequence. So we need to send the ULPS exit sequence 24399b4362f2b5ad6d0cf6b5754000b8db80d0592e89Tomi Valkeinen * manually by setting positive lines high and negative lines 24409b4362f2b5ad6d0cf6b5754000b8db80d0592e89Tomi Valkeinen * low for 1ms. 244140885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen */ 244240885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen 24439b4362f2b5ad6d0cf6b5754000b8db80d0592e89Tomi Valkeinen mask_p = 0; 244475d7247c07d27d046323504e2dbca5b3e94fbeceArchit Taneja 24459b4362f2b5ad6d0cf6b5754000b8db80d0592e89Tomi Valkeinen for (i = 0; i < dsi->num_lanes_supported; ++i) { 24469b4362f2b5ad6d0cf6b5754000b8db80d0592e89Tomi Valkeinen if (dsi->lanes[i].function == DSI_LANE_UNUSED) 24479b4362f2b5ad6d0cf6b5754000b8db80d0592e89Tomi Valkeinen continue; 24489b4362f2b5ad6d0cf6b5754000b8db80d0592e89Tomi Valkeinen mask_p |= 1 << i; 24499b4362f2b5ad6d0cf6b5754000b8db80d0592e89Tomi Valkeinen } 245075d7247c07d27d046323504e2dbca5b3e94fbeceArchit Taneja 24519b4362f2b5ad6d0cf6b5754000b8db80d0592e89Tomi Valkeinen dsi_cio_enable_lane_override(dssdev, mask_p, 0); 245240885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen } 24533de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2454a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja r = dsi_cio_power(dsidev, DSI_COMPLEXIO_POWER_ON); 24553de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (r) 245665c62bb953d216aaf0e22692e8e12e5c568a3b02Tomi Valkeinen goto err_cio_pwr; 245765c62bb953d216aaf0e22692e8e12e5c568a3b02Tomi Valkeinen 2458a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja if (wait_for_bit_change(dsidev, DSI_COMPLEXIO_CFG1, 29, 1) != 1) { 245965c62bb953d216aaf0e22692e8e12e5c568a3b02Tomi Valkeinen DSSERR("CIO PWR clock domain not coming out of reset.\n"); 246065c62bb953d216aaf0e22692e8e12e5c568a3b02Tomi Valkeinen r = -ENODEV; 246165c62bb953d216aaf0e22692e8e12e5c568a3b02Tomi Valkeinen goto err_cio_pwr_dom; 246265c62bb953d216aaf0e22692e8e12e5c568a3b02Tomi Valkeinen } 246365c62bb953d216aaf0e22692e8e12e5c568a3b02Tomi Valkeinen 2464a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_if_enable(dsidev, true); 2465a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_if_enable(dsidev, false); 2466a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja REG_FLD_MOD(dsidev, DSI_CLK_CTRL, 1, 20, 20); /* LP_CLK_ENABLE */ 24673de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 246803329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen r = dsi_cio_wait_tx_clk_esc_reset(dssdev); 246903329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen if (r) 247003329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen goto err_tx_clk_esc_rst; 247103329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinen 2472f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (dsi->ulps_enabled) { 247340885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen /* Keep Mark-1 state for 1ms (as per DSI spec) */ 247440885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen ktime_t wait = ns_to_ktime(1000 * 1000); 247540885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen set_current_state(TASK_UNINTERRUPTIBLE); 247640885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen schedule_hrtimeout(&wait, HRTIMER_MODE_REL); 247740885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen 247840885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen /* Disable the override. The lanes should be set to Mark-11 247940885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen * state by the HW */ 2480a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_cio_disable_lane_override(dsidev); 248140885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen } 248240885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen 248340885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen /* FORCE_TX_STOP_MODE_IO */ 2484a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja REG_FLD_MOD(dsidev, DSI_TIMING1, 0, 15, 15); 248540885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen 2486a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_cio_timings(dsidev); 24873de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 24888af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja if (dssdev->panel.dsi_mode == OMAP_DSS_DSI_VIDEO_MODE) { 24898af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja /* DDR_CLK_ALWAYS_ON */ 24908af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja REG_FLD_MOD(dsidev, DSI_CLK_CTRL, 24918af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja dssdev->panel.dsi_vm_data.ddr_clk_always_on, 13, 13); 24928af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja } 24938af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 2494f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->ulps_enabled = false; 24953de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 24963de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("CIO init done\n"); 249765c62bb953d216aaf0e22692e8e12e5c568a3b02Tomi Valkeinen 249865c62bb953d216aaf0e22692e8e12e5c568a3b02Tomi Valkeinen return 0; 249965c62bb953d216aaf0e22692e8e12e5c568a3b02Tomi Valkeinen 250003329ace1dc7dc9319f6f405381d898fc66fb2cbTomi Valkeinenerr_tx_clk_esc_rst: 2501a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja REG_FLD_MOD(dsidev, DSI_CLK_CTRL, 0, 20, 20); /* LP_CLK_ENABLE */ 250265c62bb953d216aaf0e22692e8e12e5c568a3b02Tomi Valkeinenerr_cio_pwr_dom: 2503a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_cio_power(dsidev, DSI_COMPLEXIO_POWER_OFF); 250465c62bb953d216aaf0e22692e8e12e5c568a3b02Tomi Valkeinenerr_cio_pwr: 2505f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (dsi->ulps_enabled) 2506a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_cio_disable_lane_override(dsidev); 250765c62bb953d216aaf0e22692e8e12e5c568a3b02Tomi Valkeinenerr_scp_clk_dom: 2508a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_disable_scp_clk(dsidev); 25095bc416cba15f43c799fc02727c6d6887f3e35a4eTomi Valkeinen dsi->disable_pads(dsidev->id, dsi_get_lane_mask(dssdev)); 25103de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return r; 25113de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 25123de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 25135bc416cba15f43c799fc02727c6d6887f3e35a4eTomi Valkeinenstatic void dsi_cio_uninit(struct omap_dss_device *dssdev) 25143de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 25155bc416cba15f43c799fc02727c6d6887f3e35a4eTomi Valkeinen struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 2516f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 2517f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 25188af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja /* DDR_CLK_ALWAYS_ON */ 25198af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja REG_FLD_MOD(dsidev, DSI_CLK_CTRL, 0, 13, 13); 25208af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 2521a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_cio_power(dsidev, DSI_COMPLEXIO_POWER_OFF); 2522a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_disable_scp_clk(dsidev); 25235bc416cba15f43c799fc02727c6d6887f3e35a4eTomi Valkeinen dsi->disable_pads(dsidev->id, dsi_get_lane_mask(dssdev)); 25243de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 25253de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2526a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic void dsi_config_tx_fifo(struct platform_device *dsidev, 2527a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja enum fifo_size size1, enum fifo_size size2, 25283de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen enum fifo_size size3, enum fifo_size size4) 25293de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 2530f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 25313de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u32 r = 0; 25323de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen int add = 0; 25333de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen int i; 25343de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2535f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->vc[0].fifo_size = size1; 2536f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->vc[1].fifo_size = size2; 2537f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->vc[2].fifo_size = size3; 2538f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->vc[3].fifo_size = size4; 25393de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 25403de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen for (i = 0; i < 4; i++) { 25413de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u8 v; 2542f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja int size = dsi->vc[i].fifo_size; 25433de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 25443de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (add + size > 4) { 25453de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("Illegal FIFO configuration\n"); 25463de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen BUG(); 25473de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 25483de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 25493de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen v = FLD_VAL(add, 2, 0) | FLD_VAL(size, 7, 4); 25503de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r |= v << (8 * i); 25513de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /*DSSDBG("TX FIFO vc %d: size %d, add %d\n", i, size, add); */ 25523de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen add += size; 25533de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 25543de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2555a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_write_reg(dsidev, DSI_TX_FIFO_VC_SIZE, r); 25563de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 25573de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2558a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic void dsi_config_rx_fifo(struct platform_device *dsidev, 2559a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja enum fifo_size size1, enum fifo_size size2, 25603de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen enum fifo_size size3, enum fifo_size size4) 25613de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 2562f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 25633de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u32 r = 0; 25643de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen int add = 0; 25653de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen int i; 25663de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2567f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->vc[0].fifo_size = size1; 2568f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->vc[1].fifo_size = size2; 2569f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->vc[2].fifo_size = size3; 2570f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->vc[3].fifo_size = size4; 25713de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 25723de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen for (i = 0; i < 4; i++) { 25733de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u8 v; 2574f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja int size = dsi->vc[i].fifo_size; 25753de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 25763de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (add + size > 4) { 25773de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("Illegal FIFO configuration\n"); 25783de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen BUG(); 25793de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 25803de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 25813de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen v = FLD_VAL(add, 2, 0) | FLD_VAL(size, 7, 4); 25823de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r |= v << (8 * i); 25833de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /*DSSDBG("RX FIFO vc %d: size %d, add %d\n", i, size, add); */ 25843de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen add += size; 25853de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 25863de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2587a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_write_reg(dsidev, DSI_RX_FIFO_VC_SIZE, r); 25883de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 25893de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2590a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic int dsi_force_tx_stop_mode_io(struct platform_device *dsidev) 25913de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 25923de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u32 r; 25933de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2594a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja r = dsi_read_reg(dsidev, DSI_TIMING1); 25953de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, 1, 15, 15); /* FORCE_TX_STOP_MODE_IO */ 2596a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_write_reg(dsidev, DSI_TIMING1, r); 25973de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2598a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja if (wait_for_bit_change(dsidev, DSI_TIMING1, 15, 0) != 0) { 25993de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("TX_STOP bit not going down\n"); 26003de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return -EIO; 26013de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 26023de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 26033de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return 0; 26043de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 26053de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2606a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic bool dsi_vc_is_enabled(struct platform_device *dsidev, int channel) 2607cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja{ 2608a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja return REG_GET(dsidev, DSI_VC_CTRL(channel), 0, 0); 2609cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja} 2610cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja 2611cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Tanejastatic void dsi_packet_sent_handler_vp(void *data, u32 mask) 2612cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja{ 26132e868dbe1d24a908fcb4dee0733500fd0aab0bceArchit Taneja struct dsi_packet_sent_handler_data *vp_data = 26142e868dbe1d24a908fcb4dee0733500fd0aab0bceArchit Taneja (struct dsi_packet_sent_handler_data *) data; 26152e868dbe1d24a908fcb4dee0733500fd0aab0bceArchit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(vp_data->dsidev); 2616f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja const int channel = dsi->update_channel; 2617f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja u8 bit = dsi->te_enabled ? 30 : 31; 2618cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja 26192e868dbe1d24a908fcb4dee0733500fd0aab0bceArchit Taneja if (REG_GET(vp_data->dsidev, DSI_VC_TE(channel), bit, bit) == 0) 26202e868dbe1d24a908fcb4dee0733500fd0aab0bceArchit Taneja complete(vp_data->completion); 2621cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja} 2622cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja 2623a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic int dsi_sync_vc_vp(struct platform_device *dsidev, int channel) 2624cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja{ 2625f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 26262e868dbe1d24a908fcb4dee0733500fd0aab0bceArchit Taneja DECLARE_COMPLETION_ONSTACK(completion); 26272e868dbe1d24a908fcb4dee0733500fd0aab0bceArchit Taneja struct dsi_packet_sent_handler_data vp_data = { dsidev, &completion }; 2628cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja int r = 0; 2629cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja u8 bit; 2630cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja 2631f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja bit = dsi->te_enabled ? 30 : 31; 2632cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja 2633a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja r = dsi_register_isr_vc(dsidev, channel, dsi_packet_sent_handler_vp, 26342e868dbe1d24a908fcb4dee0733500fd0aab0bceArchit Taneja &vp_data, DSI_VC_IRQ_PACKET_SENT); 2635cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja if (r) 2636cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja goto err0; 2637cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja 2638cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja /* Wait for completion only if TE_EN/TE_START is still set */ 2639a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja if (REG_GET(dsidev, DSI_VC_TE(channel), bit, bit)) { 2640cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja if (wait_for_completion_timeout(&completion, 2641cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja msecs_to_jiffies(10)) == 0) { 2642cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja DSSERR("Failed to complete previous frame transfer\n"); 2643cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja r = -EIO; 2644cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja goto err1; 2645cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja } 2646cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja } 2647cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja 2648a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_unregister_isr_vc(dsidev, channel, dsi_packet_sent_handler_vp, 26492e868dbe1d24a908fcb4dee0733500fd0aab0bceArchit Taneja &vp_data, DSI_VC_IRQ_PACKET_SENT); 2650cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja 2651cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja return 0; 2652cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Tanejaerr1: 2653a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_unregister_isr_vc(dsidev, channel, dsi_packet_sent_handler_vp, 26542e868dbe1d24a908fcb4dee0733500fd0aab0bceArchit Taneja &vp_data, DSI_VC_IRQ_PACKET_SENT); 2655cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Tanejaerr0: 2656cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja return r; 2657cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja} 2658cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja 2659cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Tanejastatic void dsi_packet_sent_handler_l4(void *data, u32 mask) 2660cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja{ 26612e868dbe1d24a908fcb4dee0733500fd0aab0bceArchit Taneja struct dsi_packet_sent_handler_data *l4_data = 26622e868dbe1d24a908fcb4dee0733500fd0aab0bceArchit Taneja (struct dsi_packet_sent_handler_data *) data; 26632e868dbe1d24a908fcb4dee0733500fd0aab0bceArchit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(l4_data->dsidev); 2664f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja const int channel = dsi->update_channel; 2665cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja 26662e868dbe1d24a908fcb4dee0733500fd0aab0bceArchit Taneja if (REG_GET(l4_data->dsidev, DSI_VC_CTRL(channel), 5, 5) == 0) 26672e868dbe1d24a908fcb4dee0733500fd0aab0bceArchit Taneja complete(l4_data->completion); 2668cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja} 2669cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja 2670a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic int dsi_sync_vc_l4(struct platform_device *dsidev, int channel) 2671cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja{ 2672cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja DECLARE_COMPLETION_ONSTACK(completion); 26732e868dbe1d24a908fcb4dee0733500fd0aab0bceArchit Taneja struct dsi_packet_sent_handler_data l4_data = { dsidev, &completion }; 26742e868dbe1d24a908fcb4dee0733500fd0aab0bceArchit Taneja int r = 0; 2675cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja 2676a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja r = dsi_register_isr_vc(dsidev, channel, dsi_packet_sent_handler_l4, 26772e868dbe1d24a908fcb4dee0733500fd0aab0bceArchit Taneja &l4_data, DSI_VC_IRQ_PACKET_SENT); 2678cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja if (r) 2679cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja goto err0; 2680cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja 2681cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja /* Wait for completion only if TX_FIFO_NOT_EMPTY is still set */ 2682a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja if (REG_GET(dsidev, DSI_VC_CTRL(channel), 5, 5)) { 2683cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja if (wait_for_completion_timeout(&completion, 2684cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja msecs_to_jiffies(10)) == 0) { 2685cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja DSSERR("Failed to complete previous l4 transfer\n"); 2686cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja r = -EIO; 2687cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja goto err1; 2688cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja } 2689cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja } 2690cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja 2691a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_unregister_isr_vc(dsidev, channel, dsi_packet_sent_handler_l4, 26922e868dbe1d24a908fcb4dee0733500fd0aab0bceArchit Taneja &l4_data, DSI_VC_IRQ_PACKET_SENT); 2693cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja 2694cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja return 0; 2695cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Tanejaerr1: 2696a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_unregister_isr_vc(dsidev, channel, dsi_packet_sent_handler_l4, 26972e868dbe1d24a908fcb4dee0733500fd0aab0bceArchit Taneja &l4_data, DSI_VC_IRQ_PACKET_SENT); 2698cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Tanejaerr0: 2699cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja return r; 2700cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja} 2701cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja 2702a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic int dsi_sync_vc(struct platform_device *dsidev, int channel) 2703cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja{ 2704f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 2705f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 2706a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja WARN_ON(!dsi_bus_is_locked(dsidev)); 2707cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja 2708cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja WARN_ON(in_interrupt()); 2709cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja 2710a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja if (!dsi_vc_is_enabled(dsidev, channel)) 2711cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja return 0; 2712cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja 2713d604914484ccaaf33361558c9eb2abb441cf9d25Archit Taneja switch (dsi->vc[channel].source) { 2714d604914484ccaaf33361558c9eb2abb441cf9d25Archit Taneja case DSI_VC_SOURCE_VP: 2715a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja return dsi_sync_vc_vp(dsidev, channel); 2716d604914484ccaaf33361558c9eb2abb441cf9d25Archit Taneja case DSI_VC_SOURCE_L4: 2717a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja return dsi_sync_vc_l4(dsidev, channel); 2718cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja default: 2719cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja BUG(); 2720cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja } 2721cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja} 2722cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja 2723a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic int dsi_vc_enable(struct platform_device *dsidev, int channel, 2724a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja bool enable) 27253de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 2726446f7bff703f5f82560afde90fb22b7a1d366bbcTomi Valkeinen DSSDBG("dsi_vc_enable channel %d, enable %d\n", 2727446f7bff703f5f82560afde90fb22b7a1d366bbcTomi Valkeinen channel, enable); 27283de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 27293de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen enable = enable ? 1 : 0; 27303de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2731a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja REG_FLD_MOD(dsidev, DSI_VC_CTRL(channel), enable, 0, 0); 27323de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2733a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja if (wait_for_bit_change(dsidev, DSI_VC_CTRL(channel), 2734a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja 0, enable) != enable) { 27353de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("Failed to set dsi_vc_enable to %d\n", enable); 27363de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return -EIO; 27373de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 27383de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 27393de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return 0; 27403de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 27413de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2742a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic void dsi_vc_initial_config(struct platform_device *dsidev, int channel) 27433de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 27443de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u32 r; 27453de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 27463de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBGF("%d", channel); 27473de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2748a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja r = dsi_read_reg(dsidev, DSI_VC_CTRL(channel)); 27493de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 27503de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (FLD_GET(r, 15, 15)) /* VC_BUSY */ 27513de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("VC(%d) busy when trying to configure it!\n", 27523de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen channel); 27533de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 27543de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, 0, 1, 1); /* SOURCE, 0 = L4 */ 27553de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, 0, 2, 2); /* BTA_SHORT_EN */ 27563de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, 0, 3, 3); /* BTA_LONG_EN */ 27573de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, 0, 4, 4); /* MODE, 0 = command */ 27583de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, 1, 7, 7); /* CS_TX_EN */ 27593de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, 1, 8, 8); /* ECC_TX_EN */ 27603de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, 0, 9, 9); /* MODE_SPEED, high speed on/off */ 27619613c02b5feba3ea03ab34f1422dd122c6e54f57Archit Taneja if (dss_has_feature(FEAT_DSI_VC_OCP_WIDTH)) 27629613c02b5feba3ea03ab34f1422dd122c6e54f57Archit Taneja r = FLD_MOD(r, 3, 11, 10); /* OCP_WIDTH = 32 bit */ 27633de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 27643de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, 4, 29, 27); /* DMA_RX_REQ_NB = no dma */ 27653de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, 4, 23, 21); /* DMA_TX_REQ_NB = no dma */ 27663de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2767a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_write_reg(dsidev, DSI_VC_CTRL(channel), r); 27683de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 27693de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2770d604914484ccaaf33361558c9eb2abb441cf9d25Archit Tanejastatic int dsi_vc_config_source(struct platform_device *dsidev, int channel, 2771d604914484ccaaf33361558c9eb2abb441cf9d25Archit Taneja enum dsi_vc_source source) 27723de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 2773f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 2774f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 2775d604914484ccaaf33361558c9eb2abb441cf9d25Archit Taneja if (dsi->vc[channel].source == source) 27769ecd96842bc6312fdb2f84b6379a6f92686e2fd0Tomi Valkeinen return 0; 27773de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 27783de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBGF("%d", channel); 27793de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2780a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_sync_vc(dsidev, channel); 2781cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja 2782a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_vc_enable(dsidev, channel, 0); 27833de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 27849ecd96842bc6312fdb2f84b6379a6f92686e2fd0Tomi Valkeinen /* VC_BUSY */ 2785a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja if (wait_for_bit_change(dsidev, DSI_VC_CTRL(channel), 15, 0) != 0) { 27863de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("vc(%d) busy when trying to config for VP\n", channel); 27879ecd96842bc6312fdb2f84b6379a6f92686e2fd0Tomi Valkeinen return -EIO; 27889ecd96842bc6312fdb2f84b6379a6f92686e2fd0Tomi Valkeinen } 27893de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2790d604914484ccaaf33361558c9eb2abb441cf9d25Archit Taneja /* SOURCE, 0 = L4, 1 = video port */ 2791d604914484ccaaf33361558c9eb2abb441cf9d25Archit Taneja REG_FLD_MOD(dsidev, DSI_VC_CTRL(channel), source, 1, 1); 27923de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 27939613c02b5feba3ea03ab34f1422dd122c6e54f57Archit Taneja /* DCS_CMD_ENABLE */ 2794d604914484ccaaf33361558c9eb2abb441cf9d25Archit Taneja if (dss_has_feature(FEAT_DSI_DCS_CMD_CONFIG_VC)) { 2795d604914484ccaaf33361558c9eb2abb441cf9d25Archit Taneja bool enable = source == DSI_VC_SOURCE_VP; 2796d604914484ccaaf33361558c9eb2abb441cf9d25Archit Taneja REG_FLD_MOD(dsidev, DSI_VC_CTRL(channel), enable, 30, 30); 2797d604914484ccaaf33361558c9eb2abb441cf9d25Archit Taneja } 27989613c02b5feba3ea03ab34f1422dd122c6e54f57Archit Taneja 2799a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_vc_enable(dsidev, channel, 1); 28003de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2801d604914484ccaaf33361558c9eb2abb441cf9d25Archit Taneja dsi->vc[channel].source = source; 28029ecd96842bc6312fdb2f84b6379a6f92686e2fd0Tomi Valkeinen 28039ecd96842bc6312fdb2f84b6379a6f92686e2fd0Tomi Valkeinen return 0; 28043de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 28053de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 28061ffefe755c2681752a10ae50b2b17e70147bb194Archit Tanejavoid omapdss_dsi_vc_enable_hs(struct omap_dss_device *dssdev, int channel, 28071ffefe755c2681752a10ae50b2b17e70147bb194Archit Taneja bool enable) 28083de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 2809a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 2810a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja 28113de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("dsi_vc_enable_hs(%d, %d)\n", channel, enable); 28123de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2813a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja WARN_ON(!dsi_bus_is_locked(dsidev)); 281461140c9a88ce1f1dee4e98a0c442f9a84b4c5e6bTomi Valkeinen 2815a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_vc_enable(dsidev, channel, 0); 2816a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_if_enable(dsidev, 0); 28173de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2818a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja REG_FLD_MOD(dsidev, DSI_VC_CTRL(channel), enable, 9, 9); 28193de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2820a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_vc_enable(dsidev, channel, 1); 2821a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_if_enable(dsidev, 1); 28223de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2823a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_force_tx_stop_mode_io(dsidev); 28248af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 28258af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja /* start the DDR clock by sending a NULL packet */ 28268af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja if (dssdev->panel.dsi_vm_data.ddr_clk_always_on && enable) 28278af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja dsi_vc_send_null(dssdev, channel); 28283de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 282961140c9a88ce1f1dee4e98a0c442f9a84b4c5e6bTomi ValkeinenEXPORT_SYMBOL(omapdss_dsi_vc_enable_hs); 28303de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2831a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic void dsi_vc_flush_long_data(struct platform_device *dsidev, int channel) 28323de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 2833a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja while (REG_GET(dsidev, DSI_VC_CTRL(channel), 20, 20)) { 28343de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u32 val; 2835a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja val = dsi_read_reg(dsidev, DSI_VC_SHORT_PACKET_HEADER(channel)); 28363de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("\t\tb1 %#02x b2 %#02x b3 %#02x b4 %#02x\n", 28373de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen (val >> 0) & 0xff, 28383de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen (val >> 8) & 0xff, 28393de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen (val >> 16) & 0xff, 28403de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen (val >> 24) & 0xff); 28413de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 28423de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 28433de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 28443de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinenstatic void dsi_show_rx_ack_with_err(u16 err) 28453de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 28463de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("\tACK with ERROR (%#x):\n", err); 28473de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (err & (1 << 0)) 28483de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("\t\tSoT Error\n"); 28493de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (err & (1 << 1)) 28503de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("\t\tSoT Sync Error\n"); 28513de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (err & (1 << 2)) 28523de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("\t\tEoT Sync Error\n"); 28533de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (err & (1 << 3)) 28543de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("\t\tEscape Mode Entry Command Error\n"); 28553de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (err & (1 << 4)) 28563de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("\t\tLP Transmit Sync Error\n"); 28573de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (err & (1 << 5)) 28583de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("\t\tHS Receive Timeout Error\n"); 28593de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (err & (1 << 6)) 28603de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("\t\tFalse Control Error\n"); 28613de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (err & (1 << 7)) 28623de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("\t\t(reserved7)\n"); 28633de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (err & (1 << 8)) 28643de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("\t\tECC Error, single-bit (corrected)\n"); 28653de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (err & (1 << 9)) 28663de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("\t\tECC Error, multi-bit (not corrected)\n"); 28673de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (err & (1 << 10)) 28683de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("\t\tChecksum Error\n"); 28693de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (err & (1 << 11)) 28703de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("\t\tData type not recognized\n"); 28713de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (err & (1 << 12)) 28723de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("\t\tInvalid VC ID\n"); 28733de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (err & (1 << 13)) 28743de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("\t\tInvalid Transmission Length\n"); 28753de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (err & (1 << 14)) 28763de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("\t\t(reserved14)\n"); 28773de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (err & (1 << 15)) 28783de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("\t\tDSI Protocol Violation\n"); 28793de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 28803de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2881a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic u16 dsi_vc_flush_receive_data(struct platform_device *dsidev, 2882a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja int channel) 28833de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 28843de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* RX_FIFO_NOT_EMPTY */ 2885a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja while (REG_GET(dsidev, DSI_VC_CTRL(channel), 20, 20)) { 28863de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u32 val; 28873de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u8 dt; 2888a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja val = dsi_read_reg(dsidev, DSI_VC_SHORT_PACKET_HEADER(channel)); 288986a7867ebff675f5f5816222c5a2c64b35f8bea6Tomi Valkeinen DSSERR("\trawval %#08x\n", val); 28903de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen dt = FLD_GET(val, 5, 0); 28917a7c48f9ab374f5fb279f31634d857adc3f0c78cArchit Taneja if (dt == MIPI_DSI_RX_ACKNOWLEDGE_AND_ERROR_REPORT) { 28923de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u16 err = FLD_GET(val, 23, 8); 28933de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen dsi_show_rx_ack_with_err(err); 28947a7c48f9ab374f5fb279f31634d857adc3f0c78cArchit Taneja } else if (dt == MIPI_DSI_RX_DCS_SHORT_READ_RESPONSE_1BYTE) { 289586a7867ebff675f5f5816222c5a2c64b35f8bea6Tomi Valkeinen DSSERR("\tDCS short response, 1 byte: %#x\n", 28963de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen FLD_GET(val, 23, 8)); 28977a7c48f9ab374f5fb279f31634d857adc3f0c78cArchit Taneja } else if (dt == MIPI_DSI_RX_DCS_SHORT_READ_RESPONSE_2BYTE) { 289886a7867ebff675f5f5816222c5a2c64b35f8bea6Tomi Valkeinen DSSERR("\tDCS short response, 2 byte: %#x\n", 28993de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen FLD_GET(val, 23, 8)); 29007a7c48f9ab374f5fb279f31634d857adc3f0c78cArchit Taneja } else if (dt == MIPI_DSI_RX_DCS_LONG_READ_RESPONSE) { 290186a7867ebff675f5f5816222c5a2c64b35f8bea6Tomi Valkeinen DSSERR("\tDCS long response, len %d\n", 29023de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen FLD_GET(val, 23, 8)); 2903a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_vc_flush_long_data(dsidev, channel); 29043de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } else { 29053de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("\tunknown datatype 0x%02x\n", dt); 29063de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 29073de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 29083de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return 0; 29093de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 29103de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2911a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic int dsi_vc_send_bta(struct platform_device *dsidev, int channel) 29123de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 2913f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 2914f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 2915f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (dsi->debug_write || dsi->debug_read) 29163de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("dsi_vc_send_bta %d\n", channel); 29173de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2918a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja WARN_ON(!dsi_bus_is_locked(dsidev)); 29193de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2920a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja /* RX_FIFO_NOT_EMPTY */ 2921a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja if (REG_GET(dsidev, DSI_VC_CTRL(channel), 20, 20)) { 29223de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("rx fifo not empty when sending BTA, dumping data:\n"); 2923a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_vc_flush_receive_data(dsidev, channel); 29243de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 29253de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2926a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja REG_FLD_MOD(dsidev, DSI_VC_CTRL(channel), 1, 6, 6); /* BTA_EN */ 29273de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2928968f8e97a3291a3c7c9a2dee1a85a092de638f65Tomi Valkeinen /* flush posted write */ 2929968f8e97a3291a3c7c9a2dee1a85a092de638f65Tomi Valkeinen dsi_read_reg(dsidev, DSI_VC_CTRL(channel)); 2930968f8e97a3291a3c7c9a2dee1a85a092de638f65Tomi Valkeinen 29313de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return 0; 29323de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 29333de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 29341ffefe755c2681752a10ae50b2b17e70147bb194Archit Tanejaint dsi_vc_send_bta_sync(struct omap_dss_device *dssdev, int channel) 29353de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 2936a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 2937f36a06e702ef804a99ce3a286514d84610a74db5Tomi Valkeinen DECLARE_COMPLETION_ONSTACK(completion); 29383de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen int r = 0; 29393de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u32 err; 29403de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2941a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja r = dsi_register_isr_vc(dsidev, channel, dsi_completion_handler, 2942f36a06e702ef804a99ce3a286514d84610a74db5Tomi Valkeinen &completion, DSI_VC_IRQ_BTA); 2943f36a06e702ef804a99ce3a286514d84610a74db5Tomi Valkeinen if (r) 2944f36a06e702ef804a99ce3a286514d84610a74db5Tomi Valkeinen goto err0; 29453de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2946a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja r = dsi_register_isr(dsidev, dsi_completion_handler, &completion, 2947773b30b22f8c5ac4ccc52775c17809cc5826cb86Tomi Valkeinen DSI_IRQ_ERROR_MASK); 29483de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (r) 2949f36a06e702ef804a99ce3a286514d84610a74db5Tomi Valkeinen goto err1; 29503de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2951a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja r = dsi_vc_send_bta(dsidev, channel); 2952773b30b22f8c5ac4ccc52775c17809cc5826cb86Tomi Valkeinen if (r) 2953773b30b22f8c5ac4ccc52775c17809cc5826cb86Tomi Valkeinen goto err2; 2954773b30b22f8c5ac4ccc52775c17809cc5826cb86Tomi Valkeinen 2955f36a06e702ef804a99ce3a286514d84610a74db5Tomi Valkeinen if (wait_for_completion_timeout(&completion, 29563de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen msecs_to_jiffies(500)) == 0) { 29573de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("Failed to receive BTA\n"); 29583de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = -EIO; 2959773b30b22f8c5ac4ccc52775c17809cc5826cb86Tomi Valkeinen goto err2; 29603de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 29613de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2962a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja err = dsi_get_errors(dsidev); 29633de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (err) { 29643de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("Error while sending BTA: %x\n", err); 29653de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = -EIO; 2966773b30b22f8c5ac4ccc52775c17809cc5826cb86Tomi Valkeinen goto err2; 29673de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 2968773b30b22f8c5ac4ccc52775c17809cc5826cb86Tomi Valkeinenerr2: 2969a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_unregister_isr(dsidev, dsi_completion_handler, &completion, 2970773b30b22f8c5ac4ccc52775c17809cc5826cb86Tomi Valkeinen DSI_IRQ_ERROR_MASK); 2971f36a06e702ef804a99ce3a286514d84610a74db5Tomi Valkeinenerr1: 2972a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_unregister_isr_vc(dsidev, channel, dsi_completion_handler, 2973f36a06e702ef804a99ce3a286514d84610a74db5Tomi Valkeinen &completion, DSI_VC_IRQ_BTA); 2974f36a06e702ef804a99ce3a286514d84610a74db5Tomi Valkeinenerr0: 29753de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return r; 29763de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 29773de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi ValkeinenEXPORT_SYMBOL(dsi_vc_send_bta_sync); 29783de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2979a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic inline void dsi_vc_write_long_header(struct platform_device *dsidev, 2980a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja int channel, u8 data_type, u16 len, u8 ecc) 29813de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 2982f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 29833de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u32 val; 29843de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u8 data_id; 29853de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2986a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja WARN_ON(!dsi_bus_is_locked(dsidev)); 29873de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2988f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja data_id = data_type | dsi->vc[channel].vc_id << 6; 29893de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 29903de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen val = FLD_VAL(data_id, 7, 0) | FLD_VAL(len, 23, 8) | 29913de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen FLD_VAL(ecc, 31, 24); 29923de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2993a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_write_reg(dsidev, DSI_VC_LONG_PACKET_HEADER(channel), val); 29943de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 29953de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 2996a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic inline void dsi_vc_write_long_payload(struct platform_device *dsidev, 2997a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja int channel, u8 b1, u8 b2, u8 b3, u8 b4) 29983de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 29993de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u32 val; 30003de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 30013de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen val = b4 << 24 | b3 << 16 | b2 << 8 | b1 << 0; 30023de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 30033de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen/* DSSDBG("\twriting %02x, %02x, %02x, %02x (%#010x)\n", 30043de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen b1, b2, b3, b4, val); */ 30053de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3006a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_write_reg(dsidev, DSI_VC_LONG_PACKET_PAYLOAD(channel), val); 30073de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 30083de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3009a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic int dsi_vc_send_long(struct platform_device *dsidev, int channel, 3010a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja u8 data_type, u8 *data, u16 len, u8 ecc) 30113de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 30123de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /*u32 val; */ 3013f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 30143de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen int i; 30153de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u8 *p; 30163de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen int r = 0; 30173de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u8 b1, b2, b3, b4; 30183de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3019f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (dsi->debug_write) 30203de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("dsi_vc_send_long, %d bytes\n", len); 30213de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 30223de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* len + header */ 3023f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (dsi->vc[channel].fifo_size * 32 * 4 < len + 4) { 30243de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("unable to send long packet: packet too long.\n"); 30253de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return -EINVAL; 30263de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 30273de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3028d604914484ccaaf33361558c9eb2abb441cf9d25Archit Taneja dsi_vc_config_source(dsidev, channel, DSI_VC_SOURCE_L4); 30293de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3030a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_vc_write_long_header(dsidev, channel, data_type, len, ecc); 30313de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 30323de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen p = data; 30333de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen for (i = 0; i < len >> 2; i++) { 3034f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (dsi->debug_write) 30353de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("\tsending full packet %d\n", i); 30363de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 30373de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen b1 = *p++; 30383de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen b2 = *p++; 30393de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen b3 = *p++; 30403de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen b4 = *p++; 30413de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3042a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_vc_write_long_payload(dsidev, channel, b1, b2, b3, b4); 30433de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 30443de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 30453de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen i = len % 4; 30463de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (i) { 30473de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen b1 = 0; b2 = 0; b3 = 0; 30483de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3049f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (dsi->debug_write) 30503de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("\tsending remainder bytes %d\n", i); 30513de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 30523de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen switch (i) { 30533de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen case 3: 30543de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen b1 = *p++; 30553de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen b2 = *p++; 30563de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen b3 = *p++; 30573de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen break; 30583de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen case 2: 30593de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen b1 = *p++; 30603de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen b2 = *p++; 30613de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen break; 30623de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen case 1: 30633de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen b1 = *p++; 30643de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen break; 30653de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 30663de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3067a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_vc_write_long_payload(dsidev, channel, b1, b2, b3, 0); 30683de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 30693de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 30703de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return r; 30713de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 30723de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3073a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic int dsi_vc_send_short(struct platform_device *dsidev, int channel, 3074a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja u8 data_type, u16 data, u8 ecc) 30753de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 3076f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 30773de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u32 r; 30783de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u8 data_id; 30793de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3080a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja WARN_ON(!dsi_bus_is_locked(dsidev)); 30813de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3082f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (dsi->debug_write) 30833de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("dsi_vc_send_short(ch%d, dt %#x, b1 %#x, b2 %#x)\n", 30843de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen channel, 30853de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen data_type, data & 0xff, (data >> 8) & 0xff); 30863de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3087d604914484ccaaf33361558c9eb2abb441cf9d25Archit Taneja dsi_vc_config_source(dsidev, channel, DSI_VC_SOURCE_L4); 30883de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3089a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja if (FLD_GET(dsi_read_reg(dsidev, DSI_VC_CTRL(channel)), 16, 16)) { 30903de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("ERROR FIFO FULL, aborting transfer\n"); 30913de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return -EINVAL; 30923de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 30933de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3094f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja data_id = data_type | dsi->vc[channel].vc_id << 6; 30953de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 30963de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = (data_id << 0) | (data << 8) | (ecc << 24); 30973de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3098a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_write_reg(dsidev, DSI_VC_SHORT_PACKET_HEADER(channel), r); 30993de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 31003de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return 0; 31013de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 31023de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 31031ffefe755c2681752a10ae50b2b17e70147bb194Archit Tanejaint dsi_vc_send_null(struct omap_dss_device *dssdev, int channel) 31043de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 3105a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 3106a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja 310718b7d09908fdef8755d934a0c37d709e94e8461aArchit Taneja return dsi_vc_send_long(dsidev, channel, MIPI_DSI_NULL_PACKET, NULL, 310818b7d09908fdef8755d934a0c37d709e94e8461aArchit Taneja 0, 0); 31093de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 31103de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi ValkeinenEXPORT_SYMBOL(dsi_vc_send_null); 31113de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 31126ff8aa3182db248db4d91e574254316025c0243cArchit Tanejastatic int dsi_vc_write_nosync_common(struct omap_dss_device *dssdev, 31136ff8aa3182db248db4d91e574254316025c0243cArchit Taneja int channel, u8 *data, int len, enum dss_dsi_content_type type) 31143de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 3115a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 31163de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen int r; 31173de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 31186ff8aa3182db248db4d91e574254316025c0243cArchit Taneja if (len == 0) { 31196ff8aa3182db248db4d91e574254316025c0243cArchit Taneja BUG_ON(type == DSS_DSI_CONTENT_DCS); 31207a7c48f9ab374f5fb279f31634d857adc3f0c78cArchit Taneja r = dsi_vc_send_short(dsidev, channel, 31216ff8aa3182db248db4d91e574254316025c0243cArchit Taneja MIPI_DSI_GENERIC_SHORT_WRITE_0_PARAM, 0, 0); 31226ff8aa3182db248db4d91e574254316025c0243cArchit Taneja } else if (len == 1) { 31236ff8aa3182db248db4d91e574254316025c0243cArchit Taneja r = dsi_vc_send_short(dsidev, channel, 31246ff8aa3182db248db4d91e574254316025c0243cArchit Taneja type == DSS_DSI_CONTENT_GENERIC ? 31256ff8aa3182db248db4d91e574254316025c0243cArchit Taneja MIPI_DSI_GENERIC_SHORT_WRITE_1_PARAM : 31267a7c48f9ab374f5fb279f31634d857adc3f0c78cArchit Taneja MIPI_DSI_DCS_SHORT_WRITE, data[0], 0); 31273de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } else if (len == 2) { 31287a7c48f9ab374f5fb279f31634d857adc3f0c78cArchit Taneja r = dsi_vc_send_short(dsidev, channel, 31296ff8aa3182db248db4d91e574254316025c0243cArchit Taneja type == DSS_DSI_CONTENT_GENERIC ? 31306ff8aa3182db248db4d91e574254316025c0243cArchit Taneja MIPI_DSI_GENERIC_SHORT_WRITE_2_PARAM : 31317a7c48f9ab374f5fb279f31634d857adc3f0c78cArchit Taneja MIPI_DSI_DCS_SHORT_WRITE_PARAM, 31323de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen data[0] | (data[1] << 8), 0); 31333de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } else { 31346ff8aa3182db248db4d91e574254316025c0243cArchit Taneja r = dsi_vc_send_long(dsidev, channel, 31356ff8aa3182db248db4d91e574254316025c0243cArchit Taneja type == DSS_DSI_CONTENT_GENERIC ? 31366ff8aa3182db248db4d91e574254316025c0243cArchit Taneja MIPI_DSI_GENERIC_LONG_WRITE : 31376ff8aa3182db248db4d91e574254316025c0243cArchit Taneja MIPI_DSI_DCS_LONG_WRITE, data, len, 0); 31383de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 31393de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 31403de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return r; 31413de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 31426ff8aa3182db248db4d91e574254316025c0243cArchit Taneja 31436ff8aa3182db248db4d91e574254316025c0243cArchit Tanejaint dsi_vc_dcs_write_nosync(struct omap_dss_device *dssdev, int channel, 31446ff8aa3182db248db4d91e574254316025c0243cArchit Taneja u8 *data, int len) 31456ff8aa3182db248db4d91e574254316025c0243cArchit Taneja{ 31466ff8aa3182db248db4d91e574254316025c0243cArchit Taneja return dsi_vc_write_nosync_common(dssdev, channel, data, len, 31476ff8aa3182db248db4d91e574254316025c0243cArchit Taneja DSS_DSI_CONTENT_DCS); 31486ff8aa3182db248db4d91e574254316025c0243cArchit Taneja} 31493de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi ValkeinenEXPORT_SYMBOL(dsi_vc_dcs_write_nosync); 31503de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 31516ff8aa3182db248db4d91e574254316025c0243cArchit Tanejaint dsi_vc_generic_write_nosync(struct omap_dss_device *dssdev, int channel, 31526ff8aa3182db248db4d91e574254316025c0243cArchit Taneja u8 *data, int len) 31536ff8aa3182db248db4d91e574254316025c0243cArchit Taneja{ 31546ff8aa3182db248db4d91e574254316025c0243cArchit Taneja return dsi_vc_write_nosync_common(dssdev, channel, data, len, 31556ff8aa3182db248db4d91e574254316025c0243cArchit Taneja DSS_DSI_CONTENT_GENERIC); 31566ff8aa3182db248db4d91e574254316025c0243cArchit Taneja} 31576ff8aa3182db248db4d91e574254316025c0243cArchit TanejaEXPORT_SYMBOL(dsi_vc_generic_write_nosync); 31586ff8aa3182db248db4d91e574254316025c0243cArchit Taneja 31596ff8aa3182db248db4d91e574254316025c0243cArchit Tanejastatic int dsi_vc_write_common(struct omap_dss_device *dssdev, int channel, 31606ff8aa3182db248db4d91e574254316025c0243cArchit Taneja u8 *data, int len, enum dss_dsi_content_type type) 31613de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 3162a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 31633de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen int r; 31643de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 31656ff8aa3182db248db4d91e574254316025c0243cArchit Taneja r = dsi_vc_write_nosync_common(dssdev, channel, data, len, type); 31663de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (r) 31675d68e0326b146f28fbb8fe6375dd7d15ca929be7Tomi Valkeinen goto err; 31683de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 31691ffefe755c2681752a10ae50b2b17e70147bb194Archit Taneja r = dsi_vc_send_bta_sync(dssdev, channel); 31705d68e0326b146f28fbb8fe6375dd7d15ca929be7Tomi Valkeinen if (r) 31715d68e0326b146f28fbb8fe6375dd7d15ca929be7Tomi Valkeinen goto err; 31723de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3173a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja /* RX_FIFO_NOT_EMPTY */ 3174a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja if (REG_GET(dsidev, DSI_VC_CTRL(channel), 20, 20)) { 3175b63ac1e31422077bed8257a519c6668f8868ed2bTomi Valkeinen DSSERR("rx fifo not empty after write, dumping data:\n"); 3176a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_vc_flush_receive_data(dsidev, channel); 3177b63ac1e31422077bed8257a519c6668f8868ed2bTomi Valkeinen r = -EIO; 3178b63ac1e31422077bed8257a519c6668f8868ed2bTomi Valkeinen goto err; 3179b63ac1e31422077bed8257a519c6668f8868ed2bTomi Valkeinen } 3180b63ac1e31422077bed8257a519c6668f8868ed2bTomi Valkeinen 31815d68e0326b146f28fbb8fe6375dd7d15ca929be7Tomi Valkeinen return 0; 31825d68e0326b146f28fbb8fe6375dd7d15ca929be7Tomi Valkeinenerr: 31836ff8aa3182db248db4d91e574254316025c0243cArchit Taneja DSSERR("dsi_vc_write_common(ch %d, cmd 0x%02x, len %d) failed\n", 31845d68e0326b146f28fbb8fe6375dd7d15ca929be7Tomi Valkeinen channel, data[0], len); 31853de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return r; 31863de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 31876ff8aa3182db248db4d91e574254316025c0243cArchit Taneja 31886ff8aa3182db248db4d91e574254316025c0243cArchit Tanejaint dsi_vc_dcs_write(struct omap_dss_device *dssdev, int channel, u8 *data, 31896ff8aa3182db248db4d91e574254316025c0243cArchit Taneja int len) 31906ff8aa3182db248db4d91e574254316025c0243cArchit Taneja{ 31916ff8aa3182db248db4d91e574254316025c0243cArchit Taneja return dsi_vc_write_common(dssdev, channel, data, len, 31926ff8aa3182db248db4d91e574254316025c0243cArchit Taneja DSS_DSI_CONTENT_DCS); 31936ff8aa3182db248db4d91e574254316025c0243cArchit Taneja} 31943de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi ValkeinenEXPORT_SYMBOL(dsi_vc_dcs_write); 31953de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 31966ff8aa3182db248db4d91e574254316025c0243cArchit Tanejaint dsi_vc_generic_write(struct omap_dss_device *dssdev, int channel, u8 *data, 31976ff8aa3182db248db4d91e574254316025c0243cArchit Taneja int len) 31986ff8aa3182db248db4d91e574254316025c0243cArchit Taneja{ 31996ff8aa3182db248db4d91e574254316025c0243cArchit Taneja return dsi_vc_write_common(dssdev, channel, data, len, 32006ff8aa3182db248db4d91e574254316025c0243cArchit Taneja DSS_DSI_CONTENT_GENERIC); 32016ff8aa3182db248db4d91e574254316025c0243cArchit Taneja} 32026ff8aa3182db248db4d91e574254316025c0243cArchit TanejaEXPORT_SYMBOL(dsi_vc_generic_write); 32036ff8aa3182db248db4d91e574254316025c0243cArchit Taneja 32041ffefe755c2681752a10ae50b2b17e70147bb194Archit Tanejaint dsi_vc_dcs_write_0(struct omap_dss_device *dssdev, int channel, u8 dcs_cmd) 3205828c48f8c51ebfc2a00e1a834b0bc9e7fd35060fTomi Valkeinen{ 32061ffefe755c2681752a10ae50b2b17e70147bb194Archit Taneja return dsi_vc_dcs_write(dssdev, channel, &dcs_cmd, 1); 3207828c48f8c51ebfc2a00e1a834b0bc9e7fd35060fTomi Valkeinen} 3208828c48f8c51ebfc2a00e1a834b0bc9e7fd35060fTomi ValkeinenEXPORT_SYMBOL(dsi_vc_dcs_write_0); 3209828c48f8c51ebfc2a00e1a834b0bc9e7fd35060fTomi Valkeinen 32106ff8aa3182db248db4d91e574254316025c0243cArchit Tanejaint dsi_vc_generic_write_0(struct omap_dss_device *dssdev, int channel) 32116ff8aa3182db248db4d91e574254316025c0243cArchit Taneja{ 32126ff8aa3182db248db4d91e574254316025c0243cArchit Taneja return dsi_vc_generic_write(dssdev, channel, NULL, 0); 32136ff8aa3182db248db4d91e574254316025c0243cArchit Taneja} 32146ff8aa3182db248db4d91e574254316025c0243cArchit TanejaEXPORT_SYMBOL(dsi_vc_generic_write_0); 32156ff8aa3182db248db4d91e574254316025c0243cArchit Taneja 32161ffefe755c2681752a10ae50b2b17e70147bb194Archit Tanejaint dsi_vc_dcs_write_1(struct omap_dss_device *dssdev, int channel, u8 dcs_cmd, 32171ffefe755c2681752a10ae50b2b17e70147bb194Archit Taneja u8 param) 3218828c48f8c51ebfc2a00e1a834b0bc9e7fd35060fTomi Valkeinen{ 3219828c48f8c51ebfc2a00e1a834b0bc9e7fd35060fTomi Valkeinen u8 buf[2]; 3220828c48f8c51ebfc2a00e1a834b0bc9e7fd35060fTomi Valkeinen buf[0] = dcs_cmd; 3221828c48f8c51ebfc2a00e1a834b0bc9e7fd35060fTomi Valkeinen buf[1] = param; 32221ffefe755c2681752a10ae50b2b17e70147bb194Archit Taneja return dsi_vc_dcs_write(dssdev, channel, buf, 2); 3223828c48f8c51ebfc2a00e1a834b0bc9e7fd35060fTomi Valkeinen} 3224828c48f8c51ebfc2a00e1a834b0bc9e7fd35060fTomi ValkeinenEXPORT_SYMBOL(dsi_vc_dcs_write_1); 3225828c48f8c51ebfc2a00e1a834b0bc9e7fd35060fTomi Valkeinen 32266ff8aa3182db248db4d91e574254316025c0243cArchit Tanejaint dsi_vc_generic_write_1(struct omap_dss_device *dssdev, int channel, 32276ff8aa3182db248db4d91e574254316025c0243cArchit Taneja u8 param) 32286ff8aa3182db248db4d91e574254316025c0243cArchit Taneja{ 32296ff8aa3182db248db4d91e574254316025c0243cArchit Taneja return dsi_vc_generic_write(dssdev, channel, ¶m, 1); 32306ff8aa3182db248db4d91e574254316025c0243cArchit Taneja} 32316ff8aa3182db248db4d91e574254316025c0243cArchit TanejaEXPORT_SYMBOL(dsi_vc_generic_write_1); 32326ff8aa3182db248db4d91e574254316025c0243cArchit Taneja 32336ff8aa3182db248db4d91e574254316025c0243cArchit Tanejaint dsi_vc_generic_write_2(struct omap_dss_device *dssdev, int channel, 32346ff8aa3182db248db4d91e574254316025c0243cArchit Taneja u8 param1, u8 param2) 32356ff8aa3182db248db4d91e574254316025c0243cArchit Taneja{ 32366ff8aa3182db248db4d91e574254316025c0243cArchit Taneja u8 buf[2]; 32376ff8aa3182db248db4d91e574254316025c0243cArchit Taneja buf[0] = param1; 32386ff8aa3182db248db4d91e574254316025c0243cArchit Taneja buf[1] = param2; 32396ff8aa3182db248db4d91e574254316025c0243cArchit Taneja return dsi_vc_generic_write(dssdev, channel, buf, 2); 32406ff8aa3182db248db4d91e574254316025c0243cArchit Taneja} 32416ff8aa3182db248db4d91e574254316025c0243cArchit TanejaEXPORT_SYMBOL(dsi_vc_generic_write_2); 32426ff8aa3182db248db4d91e574254316025c0243cArchit Taneja 3243b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Tanejastatic int dsi_vc_dcs_send_read_request(struct omap_dss_device *dssdev, 3244b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja int channel, u8 dcs_cmd) 32453de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 3246a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 3247f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 32483de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen int r; 32493de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3250f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (dsi->debug_read) 3251b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja DSSDBG("dsi_vc_dcs_send_read_request(ch%d, dcs_cmd %x)\n", 3252b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja channel, dcs_cmd); 32533de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 32547a7c48f9ab374f5fb279f31634d857adc3f0c78cArchit Taneja r = dsi_vc_send_short(dsidev, channel, MIPI_DSI_DCS_READ, dcs_cmd, 0); 3255b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja if (r) { 3256b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja DSSERR("dsi_vc_dcs_send_read_request(ch %d, cmd 0x%02x)" 3257b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja " failed\n", channel, dcs_cmd); 3258b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja return r; 3259b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja } 32603de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3261b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja return 0; 3262b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja} 3263b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja 3264b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Tanejastatic int dsi_vc_generic_send_read_request(struct omap_dss_device *dssdev, 3265b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja int channel, u8 *reqdata, int reqlen) 3266b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja{ 3267b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 3268b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 3269b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja u16 data; 3270b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja u8 data_type; 3271b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja int r; 3272b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja 3273b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja if (dsi->debug_read) 3274b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja DSSDBG("dsi_vc_generic_send_read_request(ch %d, reqlen %d)\n", 3275b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja channel, reqlen); 3276b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja 3277b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja if (reqlen == 0) { 3278b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja data_type = MIPI_DSI_GENERIC_READ_REQUEST_0_PARAM; 3279b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja data = 0; 3280b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja } else if (reqlen == 1) { 3281b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja data_type = MIPI_DSI_GENERIC_READ_REQUEST_1_PARAM; 3282b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja data = reqdata[0]; 3283b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja } else if (reqlen == 2) { 3284b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja data_type = MIPI_DSI_GENERIC_READ_REQUEST_2_PARAM; 3285b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja data = reqdata[0] | (reqdata[1] << 8); 3286b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja } else { 3287b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja BUG(); 3288b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja } 3289b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja 3290b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja r = dsi_vc_send_short(dsidev, channel, data_type, data, 0); 3291b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja if (r) { 3292b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja DSSERR("dsi_vc_generic_send_read_request(ch %d, reqlen %d)" 3293b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja " failed\n", channel, reqlen); 3294b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja return r; 3295b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja } 3296b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja 3297b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja return 0; 3298b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja} 3299b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja 3300b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Tanejastatic int dsi_vc_read_rx_fifo(struct platform_device *dsidev, int channel, 3301b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja u8 *buf, int buflen, enum dss_dsi_content_type type) 3302b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja{ 3303b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 3304b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja u32 val; 3305b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja u8 dt; 3306b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja int r; 33073de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 33083de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* RX_FIFO_NOT_EMPTY */ 3309a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja if (REG_GET(dsidev, DSI_VC_CTRL(channel), 20, 20) == 0) { 33103de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("RX fifo empty when trying to read.\n"); 33115d68e0326b146f28fbb8fe6375dd7d15ca929be7Tomi Valkeinen r = -EIO; 33125d68e0326b146f28fbb8fe6375dd7d15ca929be7Tomi Valkeinen goto err; 33133de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 33143de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3315a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja val = dsi_read_reg(dsidev, DSI_VC_SHORT_PACKET_HEADER(channel)); 3316f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (dsi->debug_read) 33173de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("\theader: %08x\n", val); 33183de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen dt = FLD_GET(val, 5, 0); 33197a7c48f9ab374f5fb279f31634d857adc3f0c78cArchit Taneja if (dt == MIPI_DSI_RX_ACKNOWLEDGE_AND_ERROR_REPORT) { 33203de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u16 err = FLD_GET(val, 23, 8); 33213de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen dsi_show_rx_ack_with_err(err); 33225d68e0326b146f28fbb8fe6375dd7d15ca929be7Tomi Valkeinen r = -EIO; 33235d68e0326b146f28fbb8fe6375dd7d15ca929be7Tomi Valkeinen goto err; 33243de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3325b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja } else if (dt == (type == DSS_DSI_CONTENT_GENERIC ? 3326b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja MIPI_DSI_RX_GENERIC_SHORT_READ_RESPONSE_1BYTE : 3327b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja MIPI_DSI_RX_DCS_SHORT_READ_RESPONSE_1BYTE)) { 33283de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u8 data = FLD_GET(val, 15, 8); 3329f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (dsi->debug_read) 3330b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja DSSDBG("\t%s short response, 1 byte: %02x\n", 3331b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja type == DSS_DSI_CONTENT_GENERIC ? "GENERIC" : 3332b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja "DCS", data); 33333de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 33345d68e0326b146f28fbb8fe6375dd7d15ca929be7Tomi Valkeinen if (buflen < 1) { 33355d68e0326b146f28fbb8fe6375dd7d15ca929be7Tomi Valkeinen r = -EIO; 33365d68e0326b146f28fbb8fe6375dd7d15ca929be7Tomi Valkeinen goto err; 33375d68e0326b146f28fbb8fe6375dd7d15ca929be7Tomi Valkeinen } 33383de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 33393de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen buf[0] = data; 33403de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 33413de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return 1; 3342b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja } else if (dt == (type == DSS_DSI_CONTENT_GENERIC ? 3343b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja MIPI_DSI_RX_GENERIC_SHORT_READ_RESPONSE_2BYTE : 3344b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja MIPI_DSI_RX_DCS_SHORT_READ_RESPONSE_2BYTE)) { 33453de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u16 data = FLD_GET(val, 23, 8); 3346f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (dsi->debug_read) 3347b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja DSSDBG("\t%s short response, 2 byte: %04x\n", 3348b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja type == DSS_DSI_CONTENT_GENERIC ? "GENERIC" : 3349b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja "DCS", data); 33503de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 33515d68e0326b146f28fbb8fe6375dd7d15ca929be7Tomi Valkeinen if (buflen < 2) { 33525d68e0326b146f28fbb8fe6375dd7d15ca929be7Tomi Valkeinen r = -EIO; 33535d68e0326b146f28fbb8fe6375dd7d15ca929be7Tomi Valkeinen goto err; 33545d68e0326b146f28fbb8fe6375dd7d15ca929be7Tomi Valkeinen } 33553de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 33563de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen buf[0] = data & 0xff; 33573de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen buf[1] = (data >> 8) & 0xff; 33583de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 33593de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return 2; 3360b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja } else if (dt == (type == DSS_DSI_CONTENT_GENERIC ? 3361b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja MIPI_DSI_RX_GENERIC_LONG_READ_RESPONSE : 3362b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja MIPI_DSI_RX_DCS_LONG_READ_RESPONSE)) { 33633de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen int w; 33643de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen int len = FLD_GET(val, 23, 8); 3365f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (dsi->debug_read) 3366b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja DSSDBG("\t%s long response, len %d\n", 3367b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja type == DSS_DSI_CONTENT_GENERIC ? "GENERIC" : 3368b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja "DCS", len); 33693de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 33705d68e0326b146f28fbb8fe6375dd7d15ca929be7Tomi Valkeinen if (len > buflen) { 33715d68e0326b146f28fbb8fe6375dd7d15ca929be7Tomi Valkeinen r = -EIO; 33725d68e0326b146f28fbb8fe6375dd7d15ca929be7Tomi Valkeinen goto err; 33735d68e0326b146f28fbb8fe6375dd7d15ca929be7Tomi Valkeinen } 33743de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 33753de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* two byte checksum ends the packet, not included in len */ 33763de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen for (w = 0; w < len + 2;) { 33773de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen int b; 3378a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja val = dsi_read_reg(dsidev, 3379a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja DSI_VC_SHORT_PACKET_HEADER(channel)); 3380f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (dsi->debug_read) 33813de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("\t\t%02x %02x %02x %02x\n", 33823de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen (val >> 0) & 0xff, 33833de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen (val >> 8) & 0xff, 33843de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen (val >> 16) & 0xff, 33853de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen (val >> 24) & 0xff); 33863de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 33873de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen for (b = 0; b < 4; ++b) { 33883de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (w < len) 33893de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen buf[w] = (val >> (b * 8)) & 0xff; 33903de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* we discard the 2 byte checksum */ 33913de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen ++w; 33923de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 33933de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 33943de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 33953de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return len; 33963de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } else { 33973de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("\tunknown datatype 0x%02x\n", dt); 33985d68e0326b146f28fbb8fe6375dd7d15ca929be7Tomi Valkeinen r = -EIO; 33995d68e0326b146f28fbb8fe6375dd7d15ca929be7Tomi Valkeinen goto err; 34003de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 34015d68e0326b146f28fbb8fe6375dd7d15ca929be7Tomi Valkeinen 34025d68e0326b146f28fbb8fe6375dd7d15ca929be7Tomi Valkeinen BUG(); 34035d68e0326b146f28fbb8fe6375dd7d15ca929be7Tomi Valkeinenerr: 3404b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja DSSERR("dsi_vc_read_rx_fifo(ch %d type %s) failed\n", channel, 3405b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja type == DSS_DSI_CONTENT_GENERIC ? "GENERIC" : "DCS"); 3406b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja 34075d68e0326b146f28fbb8fe6375dd7d15ca929be7Tomi Valkeinen return r; 3408b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja} 3409b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja 3410b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Tanejaint dsi_vc_dcs_read(struct omap_dss_device *dssdev, int channel, u8 dcs_cmd, 3411b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja u8 *buf, int buflen) 3412b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja{ 3413b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 3414b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja int r; 3415b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja 3416b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja r = dsi_vc_dcs_send_read_request(dssdev, channel, dcs_cmd); 3417b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja if (r) 3418b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja goto err; 34195d68e0326b146f28fbb8fe6375dd7d15ca929be7Tomi Valkeinen 3420b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja r = dsi_vc_send_bta_sync(dssdev, channel); 3421b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja if (r) 3422b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja goto err; 3423b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja 3424b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja r = dsi_vc_read_rx_fifo(dsidev, channel, buf, buflen, 3425b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja DSS_DSI_CONTENT_DCS); 3426b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja if (r < 0) 3427b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja goto err; 3428b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja 3429b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja if (r != buflen) { 3430b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja r = -EIO; 3431b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja goto err; 3432b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja } 3433b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja 3434b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja return 0; 3435b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Tanejaerr: 3436b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja DSSERR("dsi_vc_dcs_read(ch %d, cmd 0x%02x) failed\n", channel, dcs_cmd); 3437b850975cd8857d9f277466e2a3cca5ee28519c6bArchit Taneja return r; 34383de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 34393de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi ValkeinenEXPORT_SYMBOL(dsi_vc_dcs_read); 34403de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3441b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Tanejastatic int dsi_vc_generic_read(struct omap_dss_device *dssdev, int channel, 3442b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja u8 *reqdata, int reqlen, u8 *buf, int buflen) 3443b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja{ 3444b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 3445b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja int r; 3446b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja 3447b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja r = dsi_vc_generic_send_read_request(dssdev, channel, reqdata, reqlen); 3448b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja if (r) 3449b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja return r; 3450b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja 3451b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja r = dsi_vc_send_bta_sync(dssdev, channel); 3452b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja if (r) 3453b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja return r; 3454b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja 3455b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja r = dsi_vc_read_rx_fifo(dsidev, channel, buf, buflen, 3456b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja DSS_DSI_CONTENT_GENERIC); 3457b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja if (r < 0) 3458b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja return r; 3459b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja 3460b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja if (r != buflen) { 3461b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja r = -EIO; 3462b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja return r; 3463b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja } 3464b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja 3465b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja return 0; 3466b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja} 3467b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja 3468b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Tanejaint dsi_vc_generic_read_0(struct omap_dss_device *dssdev, int channel, u8 *buf, 3469b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja int buflen) 3470b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja{ 3471b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja int r; 3472b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja 3473b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja r = dsi_vc_generic_read(dssdev, channel, NULL, 0, buf, buflen); 3474b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja if (r) { 3475b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja DSSERR("dsi_vc_generic_read_0(ch %d) failed\n", channel); 3476b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja return r; 3477b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja } 3478b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja 3479b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja return 0; 3480b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja} 3481b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit TanejaEXPORT_SYMBOL(dsi_vc_generic_read_0); 3482b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja 3483b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Tanejaint dsi_vc_generic_read_1(struct omap_dss_device *dssdev, int channel, u8 param, 3484b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja u8 *buf, int buflen) 3485b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja{ 3486b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja int r; 3487b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja 3488b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja r = dsi_vc_generic_read(dssdev, channel, ¶m, 1, buf, buflen); 3489b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja if (r) { 3490b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja DSSERR("dsi_vc_generic_read_1(ch %d) failed\n", channel); 3491b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja return r; 3492b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja } 3493b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja 3494b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja return 0; 3495b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja} 3496b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit TanejaEXPORT_SYMBOL(dsi_vc_generic_read_1); 3497b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja 3498b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Tanejaint dsi_vc_generic_read_2(struct omap_dss_device *dssdev, int channel, 3499b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja u8 param1, u8 param2, u8 *buf, int buflen) 3500b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja{ 3501b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja int r; 3502b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja u8 reqdata[2]; 3503b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja 3504b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja reqdata[0] = param1; 3505b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja reqdata[1] = param2; 3506b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja 3507b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja r = dsi_vc_generic_read(dssdev, channel, reqdata, 2, buf, buflen); 3508b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja if (r) { 3509b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja DSSERR("dsi_vc_generic_read_2(ch %d) failed\n", channel); 3510b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja return r; 3511b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja } 3512b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja 3513b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja return 0; 3514b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja} 3515b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit TanejaEXPORT_SYMBOL(dsi_vc_generic_read_2); 3516b3b89c05cbd9869cfd6d4e352293a2e7e3bffc6eArchit Taneja 35171ffefe755c2681752a10ae50b2b17e70147bb194Archit Tanejaint dsi_vc_set_max_rx_packet_size(struct omap_dss_device *dssdev, int channel, 35181ffefe755c2681752a10ae50b2b17e70147bb194Archit Taneja u16 len) 35193de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 3520a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 3521a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja 35227a7c48f9ab374f5fb279f31634d857adc3f0c78cArchit Taneja return dsi_vc_send_short(dsidev, channel, 35237a7c48f9ab374f5fb279f31634d857adc3f0c78cArchit Taneja MIPI_DSI_SET_MAXIMUM_RETURN_PACKET_SIZE, len, 0); 35243de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 35253de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi ValkeinenEXPORT_SYMBOL(dsi_vc_set_max_rx_packet_size); 35263de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3527a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic int dsi_enter_ulps(struct platform_device *dsidev) 352840885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen{ 3529f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 353040885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen DECLARE_COMPLETION_ONSTACK(completion); 3531522a0c2fe58fb6eb145cce07a303857b08322a2bTomi Valkeinen int r, i; 3532522a0c2fe58fb6eb145cce07a303857b08322a2bTomi Valkeinen unsigned mask; 353340885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen 353440885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen DSSDBGF(); 353540885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen 3536a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja WARN_ON(!dsi_bus_is_locked(dsidev)); 353740885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen 3538f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja WARN_ON(dsi->ulps_enabled); 353940885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen 3540f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (dsi->ulps_enabled) 354140885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen return 0; 354240885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen 35436cc78aa9843155c89faa93231332a8b3817020dfTomi Valkeinen /* DDR_CLK_ALWAYS_ON */ 3544a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja if (REG_GET(dsidev, DSI_CLK_CTRL, 13, 13)) { 35456cc78aa9843155c89faa93231332a8b3817020dfTomi Valkeinen dsi_if_enable(dsidev, 0); 35466cc78aa9843155c89faa93231332a8b3817020dfTomi Valkeinen REG_FLD_MOD(dsidev, DSI_CLK_CTRL, 0, 13, 13); 35476cc78aa9843155c89faa93231332a8b3817020dfTomi Valkeinen dsi_if_enable(dsidev, 1); 354840885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen } 354940885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen 3550a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_sync_vc(dsidev, 0); 3551a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_sync_vc(dsidev, 1); 3552a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_sync_vc(dsidev, 2); 3553a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_sync_vc(dsidev, 3); 355440885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen 3555a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_force_tx_stop_mode_io(dsidev); 355640885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen 3557a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_vc_enable(dsidev, 0, false); 3558a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_vc_enable(dsidev, 1, false); 3559a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_vc_enable(dsidev, 2, false); 3560a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_vc_enable(dsidev, 3, false); 356140885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen 3562a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja if (REG_GET(dsidev, DSI_COMPLEXIO_CFG2, 16, 16)) { /* HS_BUSY */ 356340885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen DSSERR("HS busy when enabling ULPS\n"); 356440885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen return -EIO; 356540885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen } 356640885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen 3567a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja if (REG_GET(dsidev, DSI_COMPLEXIO_CFG2, 17, 17)) { /* LP_BUSY */ 356840885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen DSSERR("LP busy when enabling ULPS\n"); 356940885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen return -EIO; 357040885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen } 357140885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen 3572a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja r = dsi_register_isr_cio(dsidev, dsi_completion_handler, &completion, 357340885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen DSI_CIO_IRQ_ULPSACTIVENOT_ALL0); 357440885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen if (r) 357540885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen return r; 357640885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen 3577522a0c2fe58fb6eb145cce07a303857b08322a2bTomi Valkeinen mask = 0; 3578522a0c2fe58fb6eb145cce07a303857b08322a2bTomi Valkeinen 3579522a0c2fe58fb6eb145cce07a303857b08322a2bTomi Valkeinen for (i = 0; i < dsi->num_lanes_supported; ++i) { 3580522a0c2fe58fb6eb145cce07a303857b08322a2bTomi Valkeinen if (dsi->lanes[i].function == DSI_LANE_UNUSED) 3581522a0c2fe58fb6eb145cce07a303857b08322a2bTomi Valkeinen continue; 3582522a0c2fe58fb6eb145cce07a303857b08322a2bTomi Valkeinen mask |= 1 << i; 3583522a0c2fe58fb6eb145cce07a303857b08322a2bTomi Valkeinen } 358440885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen /* Assert TxRequestEsc for data lanes and TxUlpsClk for clk lane */ 358540885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen /* LANEx_ULPS_SIG2 */ 3586522a0c2fe58fb6eb145cce07a303857b08322a2bTomi Valkeinen REG_FLD_MOD(dsidev, DSI_COMPLEXIO_CFG2, mask, 9, 5); 358740885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen 3588a702c85906390282e2aabb6cb30e448e23ee1599Tomi Valkeinen /* flush posted write and wait for SCP interface to finish the write */ 3589a702c85906390282e2aabb6cb30e448e23ee1599Tomi Valkeinen dsi_read_reg(dsidev, DSI_COMPLEXIO_CFG2); 359040885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen 359140885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen if (wait_for_completion_timeout(&completion, 359240885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen msecs_to_jiffies(1000)) == 0) { 359340885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen DSSERR("ULPS enable timeout\n"); 359440885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen r = -EIO; 359540885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen goto err; 359640885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen } 359740885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen 3598a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_unregister_isr_cio(dsidev, dsi_completion_handler, &completion, 359940885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen DSI_CIO_IRQ_ULPSACTIVENOT_ALL0); 360040885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen 36018ef0e614b3ed2e2daf7e9cefd9a2f12652f824bcTomi Valkeinen /* Reset LANEx_ULPS_SIG2 */ 3602522a0c2fe58fb6eb145cce07a303857b08322a2bTomi Valkeinen REG_FLD_MOD(dsidev, DSI_COMPLEXIO_CFG2, 0, 9, 5); 36038ef0e614b3ed2e2daf7e9cefd9a2f12652f824bcTomi Valkeinen 3604a702c85906390282e2aabb6cb30e448e23ee1599Tomi Valkeinen /* flush posted write and wait for SCP interface to finish the write */ 3605a702c85906390282e2aabb6cb30e448e23ee1599Tomi Valkeinen dsi_read_reg(dsidev, DSI_COMPLEXIO_CFG2); 36068ef0e614b3ed2e2daf7e9cefd9a2f12652f824bcTomi Valkeinen 3607a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_cio_power(dsidev, DSI_COMPLEXIO_POWER_ULPS); 360840885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen 3609a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_if_enable(dsidev, false); 361040885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen 3611f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->ulps_enabled = true; 361240885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen 361340885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen return 0; 361440885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen 361540885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinenerr: 3616a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_unregister_isr_cio(dsidev, dsi_completion_handler, &completion, 361740885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen DSI_CIO_IRQ_ULPSACTIVENOT_ALL0); 361840885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen return r; 361940885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen} 362040885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen 3621a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic void dsi_set_lp_rx_timeout(struct platform_device *dsidev, 3622a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja unsigned ticks, bool x4, bool x16) 36233de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 36243de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen unsigned long fck; 36254ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen unsigned long total_ticks; 36264ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen u32 r; 36273de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 36284ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen BUG_ON(ticks > 0x1fff); 36293de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 36304ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen /* ticks in DSI_FCK */ 3631a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja fck = dsi_fclk_rate(dsidev); 36323de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3633a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja r = dsi_read_reg(dsidev, DSI_TIMING2); 36343de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, 1, 15, 15); /* LP_RX_TO */ 36354ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen r = FLD_MOD(r, x16 ? 1 : 0, 14, 14); /* LP_RX_TO_X16 */ 36364ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen r = FLD_MOD(r, x4 ? 1 : 0, 13, 13); /* LP_RX_TO_X4 */ 36373de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, ticks, 12, 0); /* LP_RX_COUNTER */ 3638a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_write_reg(dsidev, DSI_TIMING2, r); 36393de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 36404ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen total_ticks = ticks * (x16 ? 16 : 1) * (x4 ? 4 : 1); 36414ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen 36424ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen DSSDBG("LP_RX_TO %lu ticks (%#x%s%s) = %lu ns\n", 36434ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen total_ticks, 36444ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen ticks, x4 ? " x4" : "", x16 ? " x16" : "", 36454ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen (total_ticks * 1000) / (fck / 1000 / 1000)); 36463de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 36473de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3648a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic void dsi_set_ta_timeout(struct platform_device *dsidev, unsigned ticks, 3649a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja bool x8, bool x16) 36503de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 36513de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen unsigned long fck; 36524ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen unsigned long total_ticks; 36534ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen u32 r; 36544ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen 36554ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen BUG_ON(ticks > 0x1fff); 36563de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 36573de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* ticks in DSI_FCK */ 3658a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja fck = dsi_fclk_rate(dsidev); 36593de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3660a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja r = dsi_read_reg(dsidev, DSI_TIMING1); 36613de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, 1, 31, 31); /* TA_TO */ 36624ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen r = FLD_MOD(r, x16 ? 1 : 0, 30, 30); /* TA_TO_X16 */ 36634ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen r = FLD_MOD(r, x8 ? 1 : 0, 29, 29); /* TA_TO_X8 */ 36643de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, ticks, 28, 16); /* TA_TO_COUNTER */ 3665a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_write_reg(dsidev, DSI_TIMING1, r); 36663de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 36674ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen total_ticks = ticks * (x16 ? 16 : 1) * (x8 ? 8 : 1); 36684ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen 36694ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen DSSDBG("TA_TO %lu ticks (%#x%s%s) = %lu ns\n", 36704ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen total_ticks, 36714ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen ticks, x8 ? " x8" : "", x16 ? " x16" : "", 36724ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen (total_ticks * 1000) / (fck / 1000 / 1000)); 36733de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 36743de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3675a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic void dsi_set_stop_state_counter(struct platform_device *dsidev, 3676a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja unsigned ticks, bool x4, bool x16) 36773de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 36783de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen unsigned long fck; 36794ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen unsigned long total_ticks; 36804ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen u32 r; 36813de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 36824ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen BUG_ON(ticks > 0x1fff); 36833de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 36844ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen /* ticks in DSI_FCK */ 3685a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja fck = dsi_fclk_rate(dsidev); 36863de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3687a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja r = dsi_read_reg(dsidev, DSI_TIMING1); 36883de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, 1, 15, 15); /* FORCE_TX_STOP_MODE_IO */ 36894ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen r = FLD_MOD(r, x16 ? 1 : 0, 14, 14); /* STOP_STATE_X16_IO */ 36904ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen r = FLD_MOD(r, x4 ? 1 : 0, 13, 13); /* STOP_STATE_X4_IO */ 36913de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, ticks, 12, 0); /* STOP_STATE_COUNTER_IO */ 3692a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_write_reg(dsidev, DSI_TIMING1, r); 36933de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 36944ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen total_ticks = ticks * (x16 ? 16 : 1) * (x4 ? 4 : 1); 36954ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen 36964ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen DSSDBG("STOP_STATE_COUNTER %lu ticks (%#x%s%s) = %lu ns\n", 36974ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen total_ticks, 36984ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen ticks, x4 ? " x4" : "", x16 ? " x16" : "", 36994ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen (total_ticks * 1000) / (fck / 1000 / 1000)); 37003de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 37013de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3702a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic void dsi_set_hs_tx_timeout(struct platform_device *dsidev, 3703a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja unsigned ticks, bool x4, bool x16) 37043de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 37053de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen unsigned long fck; 37064ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen unsigned long total_ticks; 37074ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen u32 r; 37083de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 37094ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen BUG_ON(ticks > 0x1fff); 37103de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 37114ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen /* ticks in TxByteClkHS */ 3712a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja fck = dsi_get_txbyteclkhs(dsidev); 37133de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3714a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja r = dsi_read_reg(dsidev, DSI_TIMING2); 37153de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, 1, 31, 31); /* HS_TX_TO */ 37164ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen r = FLD_MOD(r, x16 ? 1 : 0, 30, 30); /* HS_TX_TO_X16 */ 37174ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen r = FLD_MOD(r, x4 ? 1 : 0, 29, 29); /* HS_TX_TO_X8 (4 really) */ 37183de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, ticks, 28, 16); /* HS_TX_TO_COUNTER */ 3719a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_write_reg(dsidev, DSI_TIMING2, r); 37203de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 37214ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen total_ticks = ticks * (x16 ? 16 : 1) * (x4 ? 4 : 1); 37224ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen 37234ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen DSSDBG("HS_TX_TO %lu ticks (%#x%s%s) = %lu ns\n", 37244ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen total_ticks, 37254ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen ticks, x4 ? " x4" : "", x16 ? " x16" : "", 37264ffa35713e263fbf4975e14bc6f4a515b7701349Tomi Valkeinen (total_ticks * 1000) / (fck / 1000 / 1000)); 37273de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 37288af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 37298af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Tanejastatic void dsi_config_vp_num_line_buffers(struct omap_dss_device *dssdev) 37308af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja{ 37318af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 37328af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja int num_line_buffers; 37338af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 37348af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja if (dssdev->panel.dsi_mode == OMAP_DSS_DSI_VIDEO_MODE) { 37358af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja int bpp = dsi_get_pixel_size(dssdev->panel.dsi_pix_fmt); 37368af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja unsigned line_buf_size = dsi_get_line_buf_size(dsidev); 37378af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja struct omap_video_timings *timings = &dssdev->panel.timings; 37388af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja /* 37398af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja * Don't use line buffers if width is greater than the video 37408af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja * port's line buffer size 37418af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja */ 37428af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja if (line_buf_size <= timings->x_res * bpp / 8) 37438af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja num_line_buffers = 0; 37448af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja else 37458af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja num_line_buffers = 2; 37468af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja } else { 37478af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja /* Use maximum number of line buffers in command mode */ 37488af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja num_line_buffers = 2; 37498af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja } 37508af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 37518af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja /* LINE_BUFFER */ 37528af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja REG_FLD_MOD(dsidev, DSI_CTRL, num_line_buffers, 13, 12); 37538af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja} 37548af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 37558af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Tanejastatic void dsi_config_vp_sync_events(struct omap_dss_device *dssdev) 37568af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja{ 37578af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 37588af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja int de_pol = dssdev->panel.dsi_vm_data.vp_de_pol; 37598af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja int hsync_pol = dssdev->panel.dsi_vm_data.vp_hsync_pol; 37608af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja int vsync_pol = dssdev->panel.dsi_vm_data.vp_vsync_pol; 37618af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja bool vsync_end = dssdev->panel.dsi_vm_data.vp_vsync_end; 37628af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja bool hsync_end = dssdev->panel.dsi_vm_data.vp_hsync_end; 37638af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja u32 r; 37648af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 37658af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja r = dsi_read_reg(dsidev, DSI_CTRL); 37668af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja r = FLD_MOD(r, de_pol, 9, 9); /* VP_DE_POL */ 37678af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja r = FLD_MOD(r, hsync_pol, 10, 10); /* VP_HSYNC_POL */ 37688af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja r = FLD_MOD(r, vsync_pol, 11, 11); /* VP_VSYNC_POL */ 37698af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja r = FLD_MOD(r, 1, 15, 15); /* VP_VSYNC_START */ 37708af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja r = FLD_MOD(r, vsync_end, 16, 16); /* VP_VSYNC_END */ 37718af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja r = FLD_MOD(r, 1, 17, 17); /* VP_HSYNC_START */ 37728af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja r = FLD_MOD(r, hsync_end, 18, 18); /* VP_HSYNC_END */ 37738af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja dsi_write_reg(dsidev, DSI_CTRL, r); 37748af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja} 37758af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 37768af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Tanejastatic void dsi_config_blanking_modes(struct omap_dss_device *dssdev) 37778af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja{ 37788af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 37798af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja int blanking_mode = dssdev->panel.dsi_vm_data.blanking_mode; 37808af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja int hfp_blanking_mode = dssdev->panel.dsi_vm_data.hfp_blanking_mode; 37818af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja int hbp_blanking_mode = dssdev->panel.dsi_vm_data.hbp_blanking_mode; 37828af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja int hsa_blanking_mode = dssdev->panel.dsi_vm_data.hsa_blanking_mode; 37838af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja u32 r; 37848af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 37858af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja /* 37868af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja * 0 = TX FIFO packets sent or LPS in corresponding blanking periods 37878af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja * 1 = Long blanking packets are sent in corresponding blanking periods 37888af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja */ 37898af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja r = dsi_read_reg(dsidev, DSI_CTRL); 37908af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja r = FLD_MOD(r, blanking_mode, 20, 20); /* BLANKING_MODE */ 37918af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja r = FLD_MOD(r, hfp_blanking_mode, 21, 21); /* HFP_BLANKING */ 37928af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja r = FLD_MOD(r, hbp_blanking_mode, 22, 22); /* HBP_BLANKING */ 37938af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja r = FLD_MOD(r, hsa_blanking_mode, 23, 23); /* HSA_BLANKING */ 37948af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja dsi_write_reg(dsidev, DSI_CTRL, r); 37958af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja} 37968af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 37973de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinenstatic int dsi_proto_config(struct omap_dss_device *dssdev) 37983de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 3799a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 38003de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u32 r; 38013de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen int buswidth = 0; 38023de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3803a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_config_tx_fifo(dsidev, DSI_FIFO_SIZE_32, 3804dd8079d6a9c2aa292dacaf1b42f526558e20379fTomi Valkeinen DSI_FIFO_SIZE_32, 3805dd8079d6a9c2aa292dacaf1b42f526558e20379fTomi Valkeinen DSI_FIFO_SIZE_32, 3806dd8079d6a9c2aa292dacaf1b42f526558e20379fTomi Valkeinen DSI_FIFO_SIZE_32); 38073de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3808a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_config_rx_fifo(dsidev, DSI_FIFO_SIZE_32, 3809dd8079d6a9c2aa292dacaf1b42f526558e20379fTomi Valkeinen DSI_FIFO_SIZE_32, 3810dd8079d6a9c2aa292dacaf1b42f526558e20379fTomi Valkeinen DSI_FIFO_SIZE_32, 3811dd8079d6a9c2aa292dacaf1b42f526558e20379fTomi Valkeinen DSI_FIFO_SIZE_32); 38123de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 38133de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* XXX what values for the timeouts? */ 3814a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_set_stop_state_counter(dsidev, 0x1000, false, false); 3815a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_set_ta_timeout(dsidev, 0x1fff, true, true); 3816a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_set_lp_rx_timeout(dsidev, 0x1fff, true, true); 3817a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_set_hs_tx_timeout(dsidev, 0x1fff, true, true); 38183de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3819a3b3cc2b883aac18a3388a405db809a99d66e3cfArchit Taneja switch (dsi_get_pixel_size(dssdev->panel.dsi_pix_fmt)) { 38203de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen case 16: 38213de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen buswidth = 0; 38223de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen break; 38233de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen case 18: 38243de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen buswidth = 1; 38253de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen break; 38263de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen case 24: 38273de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen buswidth = 2; 38283de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen break; 38293de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen default: 38303de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen BUG(); 38313de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 38323de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3833a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja r = dsi_read_reg(dsidev, DSI_CTRL); 38343de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, 1, 1, 1); /* CS_RX_EN */ 38353de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, 1, 2, 2); /* ECC_RX_EN */ 38363de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, 1, 3, 3); /* TX_FIFO_ARBITRATION */ 38373de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, 1, 4, 4); /* VP_CLK_RATIO, always 1, see errata*/ 38383de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, buswidth, 7, 6); /* VP_DATA_BUS_WIDTH */ 38393de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, 0, 8, 8); /* VP_CLK_POL */ 38403de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, 1, 14, 14); /* TRIGGER_RESET_MODE */ 38413de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, 1, 19, 19); /* EOT_ENABLE */ 38429613c02b5feba3ea03ab34f1422dd122c6e54f57Archit Taneja if (!dss_has_feature(FEAT_DSI_DCS_CMD_CONFIG_VC)) { 38439613c02b5feba3ea03ab34f1422dd122c6e54f57Archit Taneja r = FLD_MOD(r, 1, 24, 24); /* DCS_CMD_ENABLE */ 38449613c02b5feba3ea03ab34f1422dd122c6e54f57Archit Taneja /* DCS_CMD_CODE, 1=start, 0=continue */ 38459613c02b5feba3ea03ab34f1422dd122c6e54f57Archit Taneja r = FLD_MOD(r, 0, 25, 25); 38469613c02b5feba3ea03ab34f1422dd122c6e54f57Archit Taneja } 38473de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3848a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_write_reg(dsidev, DSI_CTRL, r); 38493de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 38508af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja dsi_config_vp_num_line_buffers(dssdev); 38518af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 38528af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja if (dssdev->panel.dsi_mode == OMAP_DSS_DSI_VIDEO_MODE) { 38538af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja dsi_config_vp_sync_events(dssdev); 38548af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja dsi_config_blanking_modes(dssdev); 38558af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja } 38568af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 3857a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_vc_initial_config(dsidev, 0); 3858a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_vc_initial_config(dsidev, 1); 3859a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_vc_initial_config(dsidev, 2); 3860a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_vc_initial_config(dsidev, 3); 38613de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 38623de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return 0; 38633de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 38643de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 38653de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinenstatic void dsi_proto_timings(struct omap_dss_device *dssdev) 38663de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 3867a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 3868db18644f90e664bf30f58cf9b8bc879598bff62fTomi Valkeinen struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 38693de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen unsigned tlpx, tclk_zero, tclk_prepare, tclk_trail; 38703de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen unsigned tclk_pre, tclk_post; 38713de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen unsigned ths_prepare, ths_prepare_ths_zero, ths_zero; 38723de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen unsigned ths_trail, ths_exit; 38733de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen unsigned ddr_clk_pre, ddr_clk_post; 38743de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen unsigned enter_hs_mode_lat, exit_hs_mode_lat; 38753de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen unsigned ths_eot; 3876db18644f90e664bf30f58cf9b8bc879598bff62fTomi Valkeinen int ndl = dsi->num_lanes_used - 1; 38773de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u32 r; 38783de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3879a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja r = dsi_read_reg(dsidev, DSI_DSIPHY_CFG0); 38803de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen ths_prepare = FLD_GET(r, 31, 24); 38813de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen ths_prepare_ths_zero = FLD_GET(r, 23, 16); 38823de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen ths_zero = ths_prepare_ths_zero - ths_prepare; 38833de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen ths_trail = FLD_GET(r, 15, 8); 38843de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen ths_exit = FLD_GET(r, 7, 0); 38853de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3886a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja r = dsi_read_reg(dsidev, DSI_DSIPHY_CFG1); 38873de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen tlpx = FLD_GET(r, 22, 16) * 2; 38883de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen tclk_trail = FLD_GET(r, 15, 8); 38893de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen tclk_zero = FLD_GET(r, 7, 0); 38903de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3891a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja r = dsi_read_reg(dsidev, DSI_DSIPHY_CFG2); 38923de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen tclk_prepare = FLD_GET(r, 7, 0); 38933de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 38943de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* min 8*UI */ 38953de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen tclk_pre = 20; 38963de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* min 60ns + 52*UI */ 3897a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja tclk_post = ns2ddr(dsidev, 60) + 26; 38983de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 38998af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja ths_eot = DIV_ROUND_UP(4, ndl); 39003de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 39013de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen ddr_clk_pre = DIV_ROUND_UP(tclk_pre + tlpx + tclk_zero + tclk_prepare, 39023de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4); 39033de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen ddr_clk_post = DIV_ROUND_UP(tclk_post + ths_trail, 4) + ths_eot; 39043de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 39053de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen BUG_ON(ddr_clk_pre == 0 || ddr_clk_pre > 255); 39063de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen BUG_ON(ddr_clk_post == 0 || ddr_clk_post > 255); 39073de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 3908a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja r = dsi_read_reg(dsidev, DSI_CLK_TIMING); 39093de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, ddr_clk_pre, 15, 8); 39103de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_MOD(r, ddr_clk_post, 7, 0); 3911a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_write_reg(dsidev, DSI_CLK_TIMING, r); 39123de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 39133de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("ddr_clk_pre %u, ddr_clk_post %u\n", 39143de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen ddr_clk_pre, 39153de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen ddr_clk_post); 39163de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 39173de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen enter_hs_mode_lat = 1 + DIV_ROUND_UP(tlpx, 4) + 39183de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DIV_ROUND_UP(ths_prepare, 4) + 39193de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DIV_ROUND_UP(ths_zero + 3, 4); 39203de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 39213de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen exit_hs_mode_lat = DIV_ROUND_UP(ths_trail + ths_exit, 4) + 1 + ths_eot; 39223de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 39233de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = FLD_VAL(enter_hs_mode_lat, 31, 16) | 39243de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen FLD_VAL(exit_hs_mode_lat, 15, 0); 3925a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_write_reg(dsidev, DSI_VM_TIMING7, r); 39263de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 39273de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("enter_hs_mode_lat %u, exit_hs_mode_lat %u\n", 39283de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen enter_hs_mode_lat, exit_hs_mode_lat); 39298af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 39308af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja if (dssdev->panel.dsi_mode == OMAP_DSS_DSI_VIDEO_MODE) { 39318af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja /* TODO: Implement a video mode check_timings function */ 39328af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja int hsa = dssdev->panel.dsi_vm_data.hsa; 39338af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja int hfp = dssdev->panel.dsi_vm_data.hfp; 39348af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja int hbp = dssdev->panel.dsi_vm_data.hbp; 39358af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja int vsa = dssdev->panel.dsi_vm_data.vsa; 39368af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja int vfp = dssdev->panel.dsi_vm_data.vfp; 39378af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja int vbp = dssdev->panel.dsi_vm_data.vbp; 39388af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja int window_sync = dssdev->panel.dsi_vm_data.window_sync; 39398af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja bool hsync_end = dssdev->panel.dsi_vm_data.vp_hsync_end; 39408af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja struct omap_video_timings *timings = &dssdev->panel.timings; 39418af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja int bpp = dsi_get_pixel_size(dssdev->panel.dsi_pix_fmt); 39428af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja int tl, t_he, width_bytes; 39438af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 39448af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja t_he = hsync_end ? 39458af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja ((hsa == 0 && ndl == 3) ? 1 : DIV_ROUND_UP(4, ndl)) : 0; 39468af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 39478af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja width_bytes = DIV_ROUND_UP(timings->x_res * bpp, 8); 39488af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 39498af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja /* TL = t_HS + HSA + t_HE + HFP + ceil((WC + 6) / NDL) + HBP */ 39508af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja tl = DIV_ROUND_UP(4, ndl) + (hsync_end ? hsa : 0) + t_he + hfp + 39518af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja DIV_ROUND_UP(width_bytes + 6, ndl) + hbp; 39528af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 39538af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja DSSDBG("HBP: %d, HFP: %d, HSA: %d, TL: %d TXBYTECLKHS\n", hbp, 39548af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja hfp, hsync_end ? hsa : 0, tl); 39558af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja DSSDBG("VBP: %d, VFP: %d, VSA: %d, VACT: %d lines\n", vbp, vfp, 39568af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja vsa, timings->y_res); 39578af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 39588af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja r = dsi_read_reg(dsidev, DSI_VM_TIMING1); 39598af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja r = FLD_MOD(r, hbp, 11, 0); /* HBP */ 39608af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja r = FLD_MOD(r, hfp, 23, 12); /* HFP */ 39618af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja r = FLD_MOD(r, hsync_end ? hsa : 0, 31, 24); /* HSA */ 39628af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja dsi_write_reg(dsidev, DSI_VM_TIMING1, r); 39638af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 39648af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja r = dsi_read_reg(dsidev, DSI_VM_TIMING2); 39658af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja r = FLD_MOD(r, vbp, 7, 0); /* VBP */ 39668af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja r = FLD_MOD(r, vfp, 15, 8); /* VFP */ 39678af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja r = FLD_MOD(r, vsa, 23, 16); /* VSA */ 39688af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja r = FLD_MOD(r, window_sync, 27, 24); /* WINDOW_SYNC */ 39698af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja dsi_write_reg(dsidev, DSI_VM_TIMING2, r); 39708af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 39718af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja r = dsi_read_reg(dsidev, DSI_VM_TIMING3); 39728af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja r = FLD_MOD(r, timings->y_res, 14, 0); /* VACT */ 39738af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja r = FLD_MOD(r, tl, 31, 16); /* TL */ 39748af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja dsi_write_reg(dsidev, DSI_VM_TIMING3, r); 39758af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja } 39768af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja} 39778af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 39789a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinenint dsi_enable_video_output(struct omap_dss_device *dssdev, int channel) 39798af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja{ 39808af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 39818af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja int bpp = dsi_get_pixel_size(dssdev->panel.dsi_pix_fmt); 39828af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja u8 data_type; 39838af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja u16 word_count; 398433ca237f80555cde41c17682991a2b58d2f14da5Tomi Valkeinen int r; 39858af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 39869a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen if (dssdev->panel.dsi_mode == OMAP_DSS_DSI_VIDEO_MODE) { 39879a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen switch (dssdev->panel.dsi_pix_fmt) { 39889a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen case OMAP_DSS_DSI_FMT_RGB888: 39899a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen data_type = MIPI_DSI_PACKED_PIXEL_STREAM_24; 39909a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen break; 39919a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen case OMAP_DSS_DSI_FMT_RGB666: 39929a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen data_type = MIPI_DSI_PIXEL_STREAM_3BYTE_18; 39939a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen break; 39949a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen case OMAP_DSS_DSI_FMT_RGB666_PACKED: 39959a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen data_type = MIPI_DSI_PACKED_PIXEL_STREAM_18; 39969a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen break; 39979a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen case OMAP_DSS_DSI_FMT_RGB565: 39989a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen data_type = MIPI_DSI_PACKED_PIXEL_STREAM_16; 39999a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen break; 40009a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen default: 40019a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen BUG(); 40029a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen }; 40038af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 40049a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen dsi_if_enable(dsidev, false); 40059a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen dsi_vc_enable(dsidev, channel, false); 40068af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 40079a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen /* MODE, 1 = video mode */ 40089a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen REG_FLD_MOD(dsidev, DSI_VC_CTRL(channel), 1, 4, 4); 40098af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 40109a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen word_count = DIV_ROUND_UP(dssdev->panel.timings.x_res * bpp, 8); 40118af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 40129a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen dsi_vc_write_long_header(dsidev, channel, data_type, 40139a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen word_count, 0); 40148af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 40159a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen dsi_vc_enable(dsidev, channel, true); 40169a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen dsi_if_enable(dsidev, true); 40179a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen } 40188af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 401933ca237f80555cde41c17682991a2b58d2f14da5Tomi Valkeinen r = dss_mgr_enable(dssdev->manager); 402033ca237f80555cde41c17682991a2b58d2f14da5Tomi Valkeinen if (r) { 402133ca237f80555cde41c17682991a2b58d2f14da5Tomi Valkeinen if (dssdev->panel.dsi_mode == OMAP_DSS_DSI_VIDEO_MODE) { 402233ca237f80555cde41c17682991a2b58d2f14da5Tomi Valkeinen dsi_if_enable(dsidev, false); 402333ca237f80555cde41c17682991a2b58d2f14da5Tomi Valkeinen dsi_vc_enable(dsidev, channel, false); 402433ca237f80555cde41c17682991a2b58d2f14da5Tomi Valkeinen } 402533ca237f80555cde41c17682991a2b58d2f14da5Tomi Valkeinen 402633ca237f80555cde41c17682991a2b58d2f14da5Tomi Valkeinen return r; 402733ca237f80555cde41c17682991a2b58d2f14da5Tomi Valkeinen } 40288af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 40298af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja return 0; 40308af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja} 40319a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi ValkeinenEXPORT_SYMBOL(dsi_enable_video_output); 40328af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 40339a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinenvoid dsi_disable_video_output(struct omap_dss_device *dssdev, int channel) 40348af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja{ 40358af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 40368af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 40379a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen if (dssdev->panel.dsi_mode == OMAP_DSS_DSI_VIDEO_MODE) { 40389a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen dsi_if_enable(dsidev, false); 40399a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen dsi_vc_enable(dsidev, channel, false); 40408af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 40419a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen /* MODE, 0 = command mode */ 40429a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen REG_FLD_MOD(dsidev, DSI_VC_CTRL(channel), 0, 4, 4); 40438af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 40449a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen dsi_vc_enable(dsidev, channel, true); 40459a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen dsi_if_enable(dsidev, true); 40469a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi Valkeinen } 40478af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 40487797c6da64852b06b585b7eca8d3f657bfc9fa47Tomi Valkeinen dss_mgr_disable(dssdev->manager); 40493de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 40509a147a65de1ac89e506ef90413f41ebd96e03fd3Tomi ValkeinenEXPORT_SYMBOL(dsi_disable_video_output); 40513de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 40523de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinenstatic void dsi_update_screen_dispc(struct omap_dss_device *dssdev, 40535476e74a03f4be972708162050c8ac7fe150449fTomi Valkeinen u16 w, u16 h) 40543de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 4055a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 4056f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 40573de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen unsigned bytespp; 40583de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen unsigned bytespl; 40593de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen unsigned bytespf; 40603de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen unsigned total_len; 40613de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen unsigned packet_payload; 40623de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen unsigned packet_len; 40633de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u32 l; 40640f16aa0ae6b84d7ae72fbe8999e6a94cb78edd4eTomi Valkeinen int r; 4065f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja const unsigned channel = dsi->update_channel; 40660c65622b1f92eb437d00ede920fc43b2ff2d44b7Archit Taneja const unsigned line_buf_size = dsi_get_line_buf_size(dsidev); 40673de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 40685476e74a03f4be972708162050c8ac7fe150449fTomi Valkeinen DSSDBG("dsi_update_screen_dispc(%dx%d)\n", w, h); 40693de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4070d604914484ccaaf33361558c9eb2abb441cf9d25Archit Taneja dsi_vc_config_source(dsidev, channel, DSI_VC_SOURCE_VP); 407118946f62c6cc8cf051bafca8b7fa72309e8a1067Tomi Valkeinen 4072a3b3cc2b883aac18a3388a405db809a99d66e3cfArchit Taneja bytespp = dsi_get_pixel_size(dssdev->panel.dsi_pix_fmt) / 8; 40733de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen bytespl = w * bytespp; 40743de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen bytespf = bytespl * h; 40753de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 40763de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* NOTE: packet_payload has to be equal to N * bytespl, where N is 40773de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen * number of lines in a packet. See errata about VP_CLK_RATIO */ 40783de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 40793de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (bytespf < line_buf_size) 40803de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen packet_payload = bytespf; 40813de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen else 40823de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen packet_payload = (line_buf_size) / bytespl * bytespl; 40833de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 40843de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen packet_len = packet_payload + 1; /* 1 byte for DCS cmd */ 40853de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen total_len = (bytespf / packet_payload) * packet_len; 40863de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 40873de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (bytespf % packet_payload) 40883de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen total_len += (bytespf % packet_payload) + 1; 40893de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 40903de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen l = FLD_VAL(total_len, 23, 0); /* TE_SIZE */ 4091a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_write_reg(dsidev, DSI_VC_TE(channel), l); 40923de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 40937a7c48f9ab374f5fb279f31634d857adc3f0c78cArchit Taneja dsi_vc_write_long_header(dsidev, channel, MIPI_DSI_DCS_LONG_WRITE, 4094a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja packet_len, 0); 40953de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4096f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (dsi->te_enabled) 40973de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen l = FLD_MOD(l, 1, 30, 30); /* TE_EN */ 40983de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen else 40993de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen l = FLD_MOD(l, 1, 31, 31); /* TE_START */ 4100a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_write_reg(dsidev, DSI_VC_TE(channel), l); 41013de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 41023de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* We put SIDLEMODE to no-idle for the duration of the transfer, 41033de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen * because DSS interrupts are not capable of waking up the CPU and the 41043de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen * framedone interrupt could be delayed for quite a long time. I think 41053de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen * the same goes for any DSS interrupts, but for some reason I have not 41063de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen * seen the problem anywhere else than here. 41073de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen */ 41083de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen dispc_disable_sidle(); 41093de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4110a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_perf_mark_start(dsidev); 411118946f62c6cc8cf051bafca8b7fa72309e8a1067Tomi Valkeinen 411249dbf5892fc67466ac2780c1d42d8a02726f5538Archit Taneja r = schedule_delayed_work(&dsi->framedone_timeout_work, 411349dbf5892fc67466ac2780c1d42d8a02726f5538Archit Taneja msecs_to_jiffies(250)); 41140f16aa0ae6b84d7ae72fbe8999e6a94cb78edd4eTomi Valkeinen BUG_ON(r == 0); 411518946f62c6cc8cf051bafca8b7fa72309e8a1067Tomi Valkeinen 41161cb0017813e82c740ef7b60bdaa0aa74eaab6a76Tomi Valkeinen dss_mgr_start_update(dssdev->manager); 41173de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4118f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (dsi->te_enabled) { 41193de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* disable LP_RX_TO, so that we can receive TE. Time to wait 41203de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen * for TE is longer than the timer allows */ 4121a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja REG_FLD_MOD(dsidev, DSI_TIMING2, 0, 15, 15); /* LP_RX_TO */ 41223de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4123a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_vc_send_bta(dsidev, channel); 41243de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 41253de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#ifdef DSI_CATCH_MISSING_TE 4126f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja mod_timer(&dsi->te_timer, jiffies + msecs_to_jiffies(250)); 41273de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#endif 41283de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 41293de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 41303de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 41313de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#ifdef DSI_CATCH_MISSING_TE 41323de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinenstatic void dsi_te_timeout(unsigned long arg) 41333de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 41343de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("TE not received for 250ms!\n"); 41353de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 41363de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#endif 41373de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4138a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic void dsi_handle_framedone(struct platform_device *dsidev, int error) 41393de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 4140f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 4141f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 41423de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* SIDLEMODE back to smart-idle */ 41433de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen dispc_enable_sidle(); 41443de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4145f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (dsi->te_enabled) { 414618946f62c6cc8cf051bafca8b7fa72309e8a1067Tomi Valkeinen /* enable LP_RX_TO again after the TE */ 4147a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja REG_FLD_MOD(dsidev, DSI_TIMING2, 1, 15, 15); /* LP_RX_TO */ 41483de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 41493de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4150f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->framedone_callback(error, dsi->framedone_data); 4151ab83b14c829e35436b423947bb5b151133314346Tomi Valkeinen 4152ab83b14c829e35436b423947bb5b151133314346Tomi Valkeinen if (!error) 4153a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_perf_show(dsidev, "DISPC"); 415418946f62c6cc8cf051bafca8b7fa72309e8a1067Tomi Valkeinen} 41553de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4156ab83b14c829e35436b423947bb5b151133314346Tomi Valkeinenstatic void dsi_framedone_timeout_work_callback(struct work_struct *work) 415718946f62c6cc8cf051bafca8b7fa72309e8a1067Tomi Valkeinen{ 4158f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = container_of(work, struct dsi_data, 4159f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja framedone_timeout_work.work); 4160ab83b14c829e35436b423947bb5b151133314346Tomi Valkeinen /* XXX While extremely unlikely, we could get FRAMEDONE interrupt after 4161ab83b14c829e35436b423947bb5b151133314346Tomi Valkeinen * 250ms which would conflict with this timeout work. What should be 4162ab83b14c829e35436b423947bb5b151133314346Tomi Valkeinen * done is first cancel the transfer on the HW, and then cancel the 4163ab83b14c829e35436b423947bb5b151133314346Tomi Valkeinen * possibly scheduled framedone work. However, cancelling the transfer 4164ab83b14c829e35436b423947bb5b151133314346Tomi Valkeinen * on the HW is buggy, and would probably require resetting the whole 4165ab83b14c829e35436b423947bb5b151133314346Tomi Valkeinen * DSI */ 416618946f62c6cc8cf051bafca8b7fa72309e8a1067Tomi Valkeinen 4167ab83b14c829e35436b423947bb5b151133314346Tomi Valkeinen DSSERR("Framedone not received for 250ms!\n"); 41683de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4169f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi_handle_framedone(dsi->pdev, -ETIMEDOUT); 41703de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 41713de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4172ab83b14c829e35436b423947bb5b151133314346Tomi Valkeinenstatic void dsi_framedone_irq_callback(void *data, u32 mask) 41733de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 4174a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct omap_dss_device *dssdev = (struct omap_dss_device *) data; 4175a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 4176f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 4177f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 4178ab83b14c829e35436b423947bb5b151133314346Tomi Valkeinen /* Note: We get FRAMEDONE when DISPC has finished sending pixels and 4179ab83b14c829e35436b423947bb5b151133314346Tomi Valkeinen * turns itself off. However, DSI still has the pixels in its buffers, 4180ab83b14c829e35436b423947bb5b151133314346Tomi Valkeinen * and is sending the data. 4181ab83b14c829e35436b423947bb5b151133314346Tomi Valkeinen */ 41823de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4183f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja __cancel_delayed_work(&dsi->framedone_timeout_work); 41843de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4185a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_handle_framedone(dsidev, 0); 41863de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4187cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja#ifdef CONFIG_OMAP2_DSS_FAKE_VSYNC 4188cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja dispc_fake_vsync_irq(); 4189cf398fb3e6aed8e7a9b3bcf77f6de2d34ccd2078Archit Taneja#endif 419018946f62c6cc8cf051bafca8b7fa72309e8a1067Tomi Valkeinen} 41913de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 41925476e74a03f4be972708162050c8ac7fe150449fTomi Valkeinenint omap_dsi_update(struct omap_dss_device *dssdev, int channel, 41935476e74a03f4be972708162050c8ac7fe150449fTomi Valkeinen void (*callback)(int, void *), void *data) 419418946f62c6cc8cf051bafca8b7fa72309e8a1067Tomi Valkeinen{ 4195a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 41965476e74a03f4be972708162050c8ac7fe150449fTomi Valkeinen struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 419718946f62c6cc8cf051bafca8b7fa72309e8a1067Tomi Valkeinen u16 dw, dh; 41983de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4199a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_perf_mark_setup(dsidev); 42003de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4201f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->update_channel = channel; 42023de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 42034a9e78abb76a2f1ddccab7098bdf73a2f095aaa6Tomi Valkeinen dsi->framedone_callback = callback; 42044a9e78abb76a2f1ddccab7098bdf73a2f095aaa6Tomi Valkeinen dsi->framedone_data = data; 4205e9c31afcffe3df90ebac343611b2f0177bf3cbe4Archit Taneja 42065476e74a03f4be972708162050c8ac7fe150449fTomi Valkeinen dssdev->driver->get_resolution(dssdev, &dw, &dh); 4207e9c31afcffe3df90ebac343611b2f0177bf3cbe4Archit Taneja 42085476e74a03f4be972708162050c8ac7fe150449fTomi Valkeinen#ifdef DEBUG 42095476e74a03f4be972708162050c8ac7fe150449fTomi Valkeinen dsi->update_bytes = dw * dh * 42105476e74a03f4be972708162050c8ac7fe150449fTomi Valkeinen dsi_get_pixel_size(dssdev->panel.dsi_pix_fmt) / 8; 42115476e74a03f4be972708162050c8ac7fe150449fTomi Valkeinen#endif 42125476e74a03f4be972708162050c8ac7fe150449fTomi Valkeinen dsi_update_screen_dispc(dssdev, dw, dh); 42133de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 42143de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return 0; 42153de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 421618946f62c6cc8cf051bafca8b7fa72309e8a1067Tomi ValkeinenEXPORT_SYMBOL(omap_dsi_update); 42173de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 42183de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen/* Display funcs */ 42193de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 42203de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinenstatic int dsi_display_init_dispc(struct omap_dss_device *dssdev) 42213de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 42223de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen int r; 42233de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 42248af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja if (dssdev->panel.dsi_mode == OMAP_DSS_DSI_CMD_MODE) { 42255476e74a03f4be972708162050c8ac7fe150449fTomi Valkeinen u16 dw, dh; 42268af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja u32 irq; 42273de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen struct omap_video_timings timings = { 42283de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen .hsw = 1, 42293de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen .hfp = 1, 42303de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen .hbp = 1, 42313de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen .vsw = 1, 42323de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen .vfp = 0, 42333de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen .vbp = 0, 42343de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen }; 42353de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 42365476e74a03f4be972708162050c8ac7fe150449fTomi Valkeinen dssdev->driver->get_resolution(dssdev, &dw, &dh); 42375476e74a03f4be972708162050c8ac7fe150449fTomi Valkeinen timings.x_res = dw; 42385476e74a03f4be972708162050c8ac7fe150449fTomi Valkeinen timings.y_res = dh; 42395476e74a03f4be972708162050c8ac7fe150449fTomi Valkeinen 42408af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja irq = dssdev->manager->id == OMAP_DSS_CHANNEL_LCD ? 42418af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja DISPC_IRQ_FRAMEDONE : DISPC_IRQ_FRAMEDONE2; 42428af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 42438af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja r = omap_dispc_register_isr(dsi_framedone_irq_callback, 42448af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja (void *) dssdev, irq); 42458af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja if (r) { 42468af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja DSSERR("can't get FRAMEDONE irq\n"); 42478af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja return r; 42488af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja } 42498af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 42508af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja dispc_mgr_enable_stallmode(dssdev->manager->id, true); 42518af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja dispc_mgr_enable_fifohandcheck(dssdev->manager->id, 1); 42528af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 425326d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen dispc_mgr_set_lcd_timings(dssdev->manager->id, &timings); 42548af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja } else { 42558af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja dispc_mgr_enable_stallmode(dssdev->manager->id, false); 42568af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja dispc_mgr_enable_fifohandcheck(dssdev->manager->id, 0); 42578af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja 42588af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja dispc_mgr_set_lcd_timings(dssdev->manager->id, 42598af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja &dssdev->panel.timings); 42603de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 42613de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 42628af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja dispc_mgr_set_lcd_display_type(dssdev->manager->id, 42638af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja OMAP_DSS_LCD_DISPLAY_TFT); 42648af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja dispc_mgr_set_tft_data_lines(dssdev->manager->id, 42658af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja dsi_get_pixel_size(dssdev->panel.dsi_pix_fmt)); 42663de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return 0; 42673de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 42683de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 42693de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinenstatic void dsi_display_uninit_dispc(struct omap_dss_device *dssdev) 42703de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 42718af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja if (dssdev->panel.dsi_mode == OMAP_DSS_DSI_CMD_MODE) { 42728af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja u32 irq; 42735a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja 42748af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja irq = dssdev->manager->id == OMAP_DSS_CHANNEL_LCD ? 42758af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja DISPC_IRQ_FRAMEDONE : DISPC_IRQ_FRAMEDONE2; 42765a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja 42778af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja omap_dispc_unregister_isr(dsi_framedone_irq_callback, 42788af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja (void *) dssdev, irq); 42798af6ff0107f0720b8fbf4feca7031d3e36c2fa11Archit Taneja } 42803de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 42813de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 42823de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinenstatic int dsi_configure_dsi_clocks(struct omap_dss_device *dssdev) 42833de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 4284a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 42853de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen struct dsi_clock_info cinfo; 42863de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen int r; 42873de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 42881bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja /* we always use DSS_CLK_SYSCK as input clock */ 42891bb478350670fadf708d3cbd6137c32dfbe3fd5fArchit Taneja cinfo.use_sys_clk = true; 4290c6940a3dc59d9628c8d407b98b6f57df69e3ef52Tomi Valkeinen cinfo.regn = dssdev->clocks.dsi.regn; 4291c6940a3dc59d9628c8d407b98b6f57df69e3ef52Tomi Valkeinen cinfo.regm = dssdev->clocks.dsi.regm; 4292c6940a3dc59d9628c8d407b98b6f57df69e3ef52Tomi Valkeinen cinfo.regm_dispc = dssdev->clocks.dsi.regm_dispc; 4293c6940a3dc59d9628c8d407b98b6f57df69e3ef52Tomi Valkeinen cinfo.regm_dsi = dssdev->clocks.dsi.regm_dsi; 4294ff1b2cde3f551c9b56887b41e0ebbf2907566a7dSumit Semwal r = dsi_calc_clock_rates(dssdev, &cinfo); 4295ebf0a3fef2240983fbc994f15d8c3d8a20102480Ville Syrjälä if (r) { 4296ebf0a3fef2240983fbc994f15d8c3d8a20102480Ville Syrjälä DSSERR("Failed to calc dsi clocks\n"); 42973de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return r; 4298ebf0a3fef2240983fbc994f15d8c3d8a20102480Ville Syrjälä } 42993de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4300a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja r = dsi_pll_set_clock_div(dsidev, &cinfo); 43013de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (r) { 43023de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("Failed to set dsi clocks\n"); 43033de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return r; 43043de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 43053de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 43063de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return 0; 43073de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 43083de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 43093de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinenstatic int dsi_configure_dispc_clocks(struct omap_dss_device *dssdev) 43103de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 4311a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 43123de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen struct dispc_clock_info dispc_cinfo; 43133de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen int r; 43143de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen unsigned long long fck; 43153de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4316a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja fck = dsi_get_pll_hsdiv_dispc_rate(dsidev); 43173de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4318e888166247c0b23d3ccc8e54cf92de7325d71145Archit Taneja dispc_cinfo.lck_div = dssdev->clocks.dispc.channel.lck_div; 4319e888166247c0b23d3ccc8e54cf92de7325d71145Archit Taneja dispc_cinfo.pck_div = dssdev->clocks.dispc.channel.pck_div; 43203de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 43213de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = dispc_calc_clock_rates(fck, &dispc_cinfo); 43223de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (r) { 43233de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("Failed to calc dispc clocks\n"); 43243de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return r; 43253de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 43263de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 432726d9dd0dbe09e8a6d1f8c8ed90cd29b049bfa6eeTomi Valkeinen r = dispc_mgr_set_clock_div(dssdev->manager->id, &dispc_cinfo); 43283de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (r) { 43293de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("Failed to set dispc clocks\n"); 43303de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return r; 43313de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 43323de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 43333de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return 0; 43343de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 43353de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 43363de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinenstatic int dsi_display_init_dsi(struct omap_dss_device *dssdev) 43373de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 4338a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 43395a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja int dsi_module = dsi_get_dsidev_id(dsidev); 43403de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen int r; 43413de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4342739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen r = dsi_parse_lane_config(dssdev); 4343739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen if (r) { 4344739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen DSSERR("illegal lane config"); 4345739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen goto err0; 4346739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen } 4347739a7f46cbf6dc3d4f899e4b566196d99403457aTomi Valkeinen 4348a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja r = dsi_pll_init(dsidev, true, true); 43493de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (r) 43503de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen goto err0; 43513de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 43523de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = dsi_configure_dsi_clocks(dssdev); 43533de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (r) 43543de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen goto err1; 43553de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4356e888166247c0b23d3ccc8e54cf92de7325d71145Archit Taneja dss_select_dispc_clk_source(dssdev->clocks.dispc.dispc_fclk_src); 43575a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja dss_select_dsi_clk_source(dsi_module, dssdev->clocks.dsi.dsi_fclk_src); 43589613c02b5feba3ea03ab34f1422dd122c6e54f57Archit Taneja dss_select_lcd_clk_source(dssdev->manager->id, 4359e888166247c0b23d3ccc8e54cf92de7325d71145Archit Taneja dssdev->clocks.dispc.channel.lcd_clk_src); 43603de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 43613de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("PLL OK\n"); 43623de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 43633de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = dsi_configure_dispc_clocks(dssdev); 43643de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (r) 43653de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen goto err2; 43663de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4367cc5c185098d85d709cc2a542c40abff0b337e094Tomi Valkeinen r = dsi_cio_init(dssdev); 43683de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (r) 43693de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen goto err2; 43703de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4371a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja _dsi_print_reset_status(dsidev); 43723de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 43733de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen dsi_proto_timings(dssdev); 43743de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen dsi_set_lp_clk_divisor(dssdev); 43753de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 43763de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (1) 4377a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja _dsi_print_reset_status(dsidev); 43783de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 43793de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = dsi_proto_config(dssdev); 43803de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (r) 43813de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen goto err3; 43823de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 43833de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen /* enable interface */ 4384a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_vc_enable(dsidev, 0, 1); 4385a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_vc_enable(dsidev, 1, 1); 4386a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_vc_enable(dsidev, 2, 1); 4387a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_vc_enable(dsidev, 3, 1); 4388a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_if_enable(dsidev, 1); 4389a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_force_tx_stop_mode_io(dsidev); 43903de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 43913de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return 0; 43923de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinenerr3: 43935bc416cba15f43c799fc02727c6d6887f3e35a4eTomi Valkeinen dsi_cio_uninit(dssdev); 43943de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinenerr2: 439589a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja dss_select_dispc_clk_source(OMAP_DSS_CLK_SRC_FCK); 43965a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja dss_select_dsi_clk_source(dsi_module, OMAP_DSS_CLK_SRC_FCK); 43975e7850917fc213882d4e409634c526a8ff310e1eTomi Valkeinen dss_select_lcd_clk_source(dssdev->manager->id, OMAP_DSS_CLK_SRC_FCK); 43985e7850917fc213882d4e409634c526a8ff310e1eTomi Valkeinen 43993de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinenerr1: 4400a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_pll_uninit(dsidev, true); 44013de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinenerr0: 44023de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return r; 44033de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 44043de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 44052a89dc15331983621b772240ebef9dea2cbe5322Tomi Valkeinenstatic void dsi_display_uninit_dsi(struct omap_dss_device *dssdev, 440622d6d676261a5e204a7078df21459747750c92fbTomi Valkeinen bool disconnect_lanes, bool enter_ulps) 44073de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 4408a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 4409f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 44105a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja int dsi_module = dsi_get_dsidev_id(dsidev); 4411a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja 4412f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (enter_ulps && !dsi->ulps_enabled) 4413a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_enter_ulps(dsidev); 441440885ab31f754426c2e9a40362e568778baa5e82Tomi Valkeinen 4415d73701044b70924f450fc6b161d952b38b7d0182Ville Syrjälä /* disable interface */ 4416a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_if_enable(dsidev, 0); 4417a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_vc_enable(dsidev, 0, 0); 4418a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_vc_enable(dsidev, 1, 0); 4419a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_vc_enable(dsidev, 2, 0); 4420a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_vc_enable(dsidev, 3, 0); 4421d73701044b70924f450fc6b161d952b38b7d0182Ville Syrjälä 442289a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja dss_select_dispc_clk_source(OMAP_DSS_CLK_SRC_FCK); 44235a8b572d832772722c3b3b7578e7fb968560fcf3Archit Taneja dss_select_dsi_clk_source(dsi_module, OMAP_DSS_CLK_SRC_FCK); 44245e7850917fc213882d4e409634c526a8ff310e1eTomi Valkeinen dss_select_lcd_clk_source(dssdev->manager->id, OMAP_DSS_CLK_SRC_FCK); 44255bc416cba15f43c799fc02727c6d6887f3e35a4eTomi Valkeinen dsi_cio_uninit(dssdev); 4426a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_pll_uninit(dsidev, disconnect_lanes); 44273de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 44283de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 442937ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinenint omapdss_dsi_display_enable(struct omap_dss_device *dssdev) 44303de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 4431a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 4432f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 44333de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen int r = 0; 44343de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 44353de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("dsi_display_enable\n"); 44363de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4437a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja WARN_ON(!dsi_bus_is_locked(dsidev)); 443837ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen 4439f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja mutex_lock(&dsi->lock); 44403de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 444105e1d6060743e34e3a9db65346168dc688f9223eTomi Valkeinen if (dssdev->manager == NULL) { 444205e1d6060743e34e3a9db65346168dc688f9223eTomi Valkeinen DSSERR("failed to enable display: no manager\n"); 444305e1d6060743e34e3a9db65346168dc688f9223eTomi Valkeinen r = -ENODEV; 444405e1d6060743e34e3a9db65346168dc688f9223eTomi Valkeinen goto err_start_dev; 444505e1d6060743e34e3a9db65346168dc688f9223eTomi Valkeinen } 444605e1d6060743e34e3a9db65346168dc688f9223eTomi Valkeinen 44473de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = omap_dss_start_device(dssdev); 44483de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (r) { 44493de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("failed to start device\n"); 44504fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen goto err_start_dev; 44513de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 44523de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 44534fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen r = dsi_runtime_get(dsidev); 44543de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (r) 44554fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen goto err_get_dsi; 44564fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 44574fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dsi_enable_pll_clock(dsidev, 1); 44583de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 44594fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen _dsi_initialize_irq(dsidev); 44603de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 44613de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = dsi_display_init_dispc(dssdev); 44623de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (r) 44634fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen goto err_init_dispc; 44643de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 44653de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen r = dsi_display_init_dsi(dssdev); 44663de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen if (r) 44674fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen goto err_init_dsi; 44683de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4469f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja mutex_unlock(&dsi->lock); 44703de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 44713de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return 0; 44723de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 44734fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenerr_init_dsi: 447437ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen dsi_display_uninit_dispc(dssdev); 44754fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenerr_init_dispc: 4476a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_enable_pll_clock(dsidev, 0); 44774fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dsi_runtime_put(dsidev); 44784fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenerr_get_dsi: 44793de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen omap_dss_stop_device(dssdev); 44804fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenerr_start_dev: 4481f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja mutex_unlock(&dsi->lock); 44823de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("dsi_display_enable FAILED\n"); 44833de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return r; 44843de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 448537ac60e414052f1d9301368437db8f0cb9e323feTomi ValkeinenEXPORT_SYMBOL(omapdss_dsi_display_enable); 44863de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 44872a89dc15331983621b772240ebef9dea2cbe5322Tomi Valkeinenvoid omapdss_dsi_display_disable(struct omap_dss_device *dssdev, 448822d6d676261a5e204a7078df21459747750c92fbTomi Valkeinen bool disconnect_lanes, bool enter_ulps) 44893de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 4490a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 4491f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 4492a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja 44933de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("dsi_display_disable\n"); 44943de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4495a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja WARN_ON(!dsi_bus_is_locked(dsidev)); 44963de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4497f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja mutex_lock(&dsi->lock); 44983de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 449915ffa1dac53820bb712851d329ba465f74b00f76Tomi Valkeinen dsi_sync_vc(dsidev, 0); 450015ffa1dac53820bb712851d329ba465f74b00f76Tomi Valkeinen dsi_sync_vc(dsidev, 1); 450115ffa1dac53820bb712851d329ba465f74b00f76Tomi Valkeinen dsi_sync_vc(dsidev, 2); 450215ffa1dac53820bb712851d329ba465f74b00f76Tomi Valkeinen dsi_sync_vc(dsidev, 3); 450315ffa1dac53820bb712851d329ba465f74b00f76Tomi Valkeinen 45043de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen dsi_display_uninit_dispc(dssdev); 45053de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 450622d6d676261a5e204a7078df21459747750c92fbTomi Valkeinen dsi_display_uninit_dsi(dssdev, disconnect_lanes, enter_ulps); 45073de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 45084fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dsi_runtime_put(dsidev); 4509a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_enable_pll_clock(dsidev, 0); 45103de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 451137ac60e414052f1d9301368437db8f0cb9e323feTomi Valkeinen omap_dss_stop_device(dssdev); 45123de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4513f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja mutex_unlock(&dsi->lock); 45143de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 451537ac60e414052f1d9301368437db8f0cb9e323feTomi ValkeinenEXPORT_SYMBOL(omapdss_dsi_display_disable); 45163de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4517225b650d41e7cdbf5cd322a461b04493caabed09Tomi Valkeinenint omapdss_dsi_enable_te(struct omap_dss_device *dssdev, bool enable) 45183de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 4519f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 4520f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 4521f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 4522f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->te_enabled = enable; 4523225b650d41e7cdbf5cd322a461b04493caabed09Tomi Valkeinen return 0; 45243de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 4525225b650d41e7cdbf5cd322a461b04493caabed09Tomi ValkeinenEXPORT_SYMBOL(omapdss_dsi_enable_te); 45263de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 45273de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinenint dsi_init_display(struct omap_dss_device *dssdev) 45283de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 4529f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 4530f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 4531f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 45323de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSDBG("DSI init\n"); 45333de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 45347e951ee9955f3df0c41e523a199cc3b9372cdb9fArchit Taneja if (dssdev->panel.dsi_mode == OMAP_DSS_DSI_CMD_MODE) { 45357e951ee9955f3df0c41e523a199cc3b9372cdb9fArchit Taneja dssdev->caps = OMAP_DSS_DISPLAY_CAP_MANUAL_UPDATE | 45367e951ee9955f3df0c41e523a199cc3b9372cdb9fArchit Taneja OMAP_DSS_DISPLAY_CAP_TEAR_ELIM; 45377e951ee9955f3df0c41e523a199cc3b9372cdb9fArchit Taneja } 45383de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4539f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (dsi->vdds_dsi_reg == NULL) { 45405f42f2ce63f5ecbd9bc744b9c25d9786e9a8e3b4Tomi Valkeinen struct regulator *vdds_dsi; 45415f42f2ce63f5ecbd9bc744b9c25d9786e9a8e3b4Tomi Valkeinen 4542f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja vdds_dsi = regulator_get(&dsi->pdev->dev, "vdds_dsi"); 45435f42f2ce63f5ecbd9bc744b9c25d9786e9a8e3b4Tomi Valkeinen 45445f42f2ce63f5ecbd9bc744b9c25d9786e9a8e3b4Tomi Valkeinen if (IS_ERR(vdds_dsi)) { 45455f42f2ce63f5ecbd9bc744b9c25d9786e9a8e3b4Tomi Valkeinen DSSERR("can't get VDDS_DSI regulator\n"); 45465f42f2ce63f5ecbd9bc744b9c25d9786e9a8e3b4Tomi Valkeinen return PTR_ERR(vdds_dsi); 45475f42f2ce63f5ecbd9bc744b9c25d9786e9a8e3b4Tomi Valkeinen } 45485f42f2ce63f5ecbd9bc744b9c25d9786e9a8e3b4Tomi Valkeinen 4549f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->vdds_dsi_reg = vdds_dsi; 45505f42f2ce63f5ecbd9bc744b9c25d9786e9a8e3b4Tomi Valkeinen } 45515f42f2ce63f5ecbd9bc744b9c25d9786e9a8e3b4Tomi Valkeinen 45523de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return 0; 45533de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 45543de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 45555ee3c1445dd89342ca8498c14afef82d0f76c794Archit Tanejaint omap_dsi_request_vc(struct omap_dss_device *dssdev, int *channel) 45565ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja{ 4557f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 4558f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 45595ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja int i; 45605ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja 4561f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja for (i = 0; i < ARRAY_SIZE(dsi->vc); i++) { 4562f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (!dsi->vc[i].dssdev) { 4563f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->vc[i].dssdev = dssdev; 45645ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja *channel = i; 45655ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja return 0; 45665ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja } 45675ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja } 45685ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja 45695ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja DSSERR("cannot get VC for display %s", dssdev->name); 45705ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja return -ENOSPC; 45715ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja} 45725ee3c1445dd89342ca8498c14afef82d0f76c794Archit TanejaEXPORT_SYMBOL(omap_dsi_request_vc); 45735ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja 45745ee3c1445dd89342ca8498c14afef82d0f76c794Archit Tanejaint omap_dsi_set_vc_id(struct omap_dss_device *dssdev, int channel, int vc_id) 45755ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja{ 4576f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 4577f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 4578f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 45795ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja if (vc_id < 0 || vc_id > 3) { 45805ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja DSSERR("VC ID out of range\n"); 45815ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja return -EINVAL; 45825ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja } 45835ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja 45845ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja if (channel < 0 || channel > 3) { 45855ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja DSSERR("Virtual Channel out of range\n"); 45865ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja return -EINVAL; 45875ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja } 45885ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja 4589f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (dsi->vc[channel].dssdev != dssdev) { 45905ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja DSSERR("Virtual Channel not allocated to display %s\n", 45915ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja dssdev->name); 45925ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja return -EINVAL; 45935ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja } 45945ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja 4595f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->vc[channel].vc_id = vc_id; 45965ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja 45975ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja return 0; 45985ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja} 45995ee3c1445dd89342ca8498c14afef82d0f76c794Archit TanejaEXPORT_SYMBOL(omap_dsi_set_vc_id); 46005ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja 46015ee3c1445dd89342ca8498c14afef82d0f76c794Archit Tanejavoid omap_dsi_release_vc(struct omap_dss_device *dssdev, int channel) 46025ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja{ 4603f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct platform_device *dsidev = dsi_get_dsidev_from_dssdev(dssdev); 4604f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 4605f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 46065ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja if ((channel >= 0 && channel <= 3) && 4607f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->vc[channel].dssdev == dssdev) { 4608f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->vc[channel].dssdev = NULL; 4609f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->vc[channel].vc_id = 0; 46105ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja } 46115ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja} 46125ee3c1445dd89342ca8498c14afef82d0f76c794Archit TanejaEXPORT_SYMBOL(omap_dsi_release_vc); 46135ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja 4614a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejavoid dsi_wait_pll_hsdiv_dispc_active(struct platform_device *dsidev) 4615e406f9079b993f4d5d7b5a3452b11df81ff2aef0Tomi Valkeinen{ 4616a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja if (wait_for_bit_change(dsidev, DSI_PLL_STATUS, 7, 1) != 1) 4617067a57e48e302863eb2d5ac0900ae9ae65dbc8c3Archit Taneja DSSERR("%s (%s) not active\n", 461889a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja dss_get_generic_clk_source_name(OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC), 461989a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja dss_feat_get_clk_source_name(OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DISPC)); 4620e406f9079b993f4d5d7b5a3452b11df81ff2aef0Tomi Valkeinen} 4621e406f9079b993f4d5d7b5a3452b11df81ff2aef0Tomi Valkeinen 4622a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejavoid dsi_wait_pll_hsdiv_dsi_active(struct platform_device *dsidev) 4623e406f9079b993f4d5d7b5a3452b11df81ff2aef0Tomi Valkeinen{ 4624a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja if (wait_for_bit_change(dsidev, DSI_PLL_STATUS, 8, 1) != 1) 4625067a57e48e302863eb2d5ac0900ae9ae65dbc8c3Archit Taneja DSSERR("%s (%s) not active\n", 462689a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja dss_get_generic_clk_source_name(OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DSI), 462789a35e5170fc579e4fc3a1f3444c5dc1aa36904dArchit Taneja dss_feat_get_clk_source_name(OMAP_DSS_CLK_SRC_DSI_PLL_HSDIV_DSI)); 4628e406f9079b993f4d5d7b5a3452b11df81ff2aef0Tomi Valkeinen} 4629e406f9079b993f4d5d7b5a3452b11df81ff2aef0Tomi Valkeinen 4630a72b64b99918ee801a3a6abf5391e356752bcad0Archit Tanejastatic void dsi_calc_clock_param_ranges(struct platform_device *dsidev) 463149641116392ad7522fa0efad53f7ed63f811bd88Archit Taneja{ 4632f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 4633f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 4634f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->regn_max = dss_feat_get_param_max(FEAT_PARAM_DSIPLL_REGN); 4635f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->regm_max = dss_feat_get_param_max(FEAT_PARAM_DSIPLL_REGM); 4636f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->regm_dispc_max = 4637f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dss_feat_get_param_max(FEAT_PARAM_DSIPLL_REGM_DISPC); 4638f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->regm_dsi_max = dss_feat_get_param_max(FEAT_PARAM_DSIPLL_REGM_DSI); 4639f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->fint_min = dss_feat_get_param_min(FEAT_PARAM_DSIPLL_FINT); 4640f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->fint_max = dss_feat_get_param_max(FEAT_PARAM_DSIPLL_FINT); 4641f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->lpdiv_max = dss_feat_get_param_max(FEAT_PARAM_DSIPLL_LPDIV); 464249641116392ad7522fa0efad53f7ed63f811bd88Archit Taneja} 464349641116392ad7522fa0efad53f7ed63f811bd88Archit Taneja 46444fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic int dsi_get_clocks(struct platform_device *dsidev) 46454fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen{ 46464fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 46474fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen struct clk *clk; 46484fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 46494fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen clk = clk_get(&dsidev->dev, "fck"); 46504fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen if (IS_ERR(clk)) { 46514fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen DSSERR("can't get fck\n"); 46524fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen return PTR_ERR(clk); 46534fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen } 46544fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 46554fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dsi->dss_clk = clk; 46564fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 4657bfe4f8d32df9d2afa5fb0dccca9dfdef8573f04aTomi Valkeinen clk = clk_get(&dsidev->dev, "sys_clk"); 46584fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen if (IS_ERR(clk)) { 46594fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen DSSERR("can't get sys_clk\n"); 46604fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen clk_put(dsi->dss_clk); 46614fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dsi->dss_clk = NULL; 46624fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen return PTR_ERR(clk); 46634fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen } 46644fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 46654fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dsi->sys_clk = clk; 46664fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 46674fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen return 0; 46684fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen} 46694fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 46704fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic void dsi_put_clocks(struct platform_device *dsidev) 46714fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen{ 46724fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 46734fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 46744fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen if (dsi->dss_clk) 46754fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen clk_put(dsi->dss_clk); 46764fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen if (dsi->sys_clk) 46774fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen clk_put(dsi->sys_clk); 46784fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen} 46794fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 4680b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen/* DSI1 HW IP initialisation */ 46817c68dd96d5a5eefe3ff6d9b94fc98fd9378aff1fTomi Valkeinenstatic int omap_dsihw_probe(struct platform_device *dsidev) 46823de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 4683d1f5857e4bc9b2620fb3e84b1dbaa0ac11b831b4Tomi Valkeinen struct omap_display_platform_data *dss_plat_data; 4684d1f5857e4bc9b2620fb3e84b1dbaa0ac11b831b4Tomi Valkeinen struct omap_dss_board_info *board_info; 46853de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen u32 rev; 4686f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja int r, i, dsi_module = dsi_get_dsidev_id(dsidev); 4687ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy struct resource *dsi_mem; 4688f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi; 4689f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 46906e2a14d2c59f6208310eeb6b031e9d1c22b38c6aJulia Lawall dsi = devm_kzalloc(&dsidev->dev, sizeof(*dsi), GFP_KERNEL); 4691cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen if (!dsi) 4692cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen return -ENOMEM; 46933de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4694f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->pdev = dsidev; 4695f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi_pdev_map[dsi_module] = dsidev; 4696f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dev_set_drvdata(&dsidev->dev, dsi); 4697a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja 4698a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dss_plat_data = dsidev->dev.platform_data; 4699d1f5857e4bc9b2620fb3e84b1dbaa0ac11b831b4Tomi Valkeinen board_info = dss_plat_data->board_data; 47005bc416cba15f43c799fc02727c6d6887f3e35a4eTomi Valkeinen dsi->enable_pads = board_info->dsi_enable_pads; 47015bc416cba15f43c799fc02727c6d6887f3e35a4eTomi Valkeinen dsi->disable_pads = board_info->dsi_disable_pads; 4702d1f5857e4bc9b2620fb3e84b1dbaa0ac11b831b4Tomi Valkeinen 4703f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja spin_lock_init(&dsi->irq_lock); 4704f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja spin_lock_init(&dsi->errors_lock); 4705f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->errors = 0; 47063de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4707dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#ifdef CONFIG_OMAP2_DSS_COLLECT_IRQ_STATS 4708f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja spin_lock_init(&dsi->irq_stats_lock); 4709f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->irq_stats.last_reset = jiffies; 4710dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen#endif 4711dfc0fd8d8850ef11951ba6c251e06096d1b5a0bdTomi Valkeinen 4712f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja mutex_init(&dsi->lock); 4713f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja sema_init(&dsi->bus_lock, 1); 47143de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4715f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja INIT_DELAYED_WORK_DEFERRABLE(&dsi->framedone_timeout_work, 471618946f62c6cc8cf051bafca8b7fa72309e8a1067Tomi Valkeinen dsi_framedone_timeout_work_callback); 471718946f62c6cc8cf051bafca8b7fa72309e8a1067Tomi Valkeinen 47183de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#ifdef DSI_CATCH_MISSING_TE 4719f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja init_timer(&dsi->te_timer); 4720f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->te_timer.function = dsi_te_timeout; 4721f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->te_timer.data = 0; 47223de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen#endif 4723f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi_mem = platform_get_resource(dsi->pdev, IORESOURCE_MEM, 0); 4724ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy if (!dsi_mem) { 4725ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy DSSERR("can't get IORESOURCE_MEM DSI\n"); 4726cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen return -EINVAL; 4727ea9da36a304eed585fc5ef89c0f1c460eca61b48Senthilvadivu Guruswamy } 4728cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen 47296e2a14d2c59f6208310eeb6b031e9d1c22b38c6aJulia Lawall dsi->base = devm_ioremap(&dsidev->dev, dsi_mem->start, 47306e2a14d2c59f6208310eeb6b031e9d1c22b38c6aJulia Lawall resource_size(dsi_mem)); 4731f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (!dsi->base) { 47323de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen DSSERR("can't ioremap DSI\n"); 4733cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen return -ENOMEM; 47343de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen } 4735cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen 4736f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->irq = platform_get_irq(dsi->pdev, 0); 4737f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (dsi->irq < 0) { 4738affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja DSSERR("platform_get_irq failed\n"); 4739cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen return -ENODEV; 4740affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja } 4741affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja 47426e2a14d2c59f6208310eeb6b031e9d1c22b38c6aJulia Lawall r = devm_request_irq(&dsidev->dev, dsi->irq, omap_dsi_irq_handler, 47436e2a14d2c59f6208310eeb6b031e9d1c22b38c6aJulia Lawall IRQF_SHARED, dev_name(&dsidev->dev), dsi->pdev); 4744affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja if (r < 0) { 4745affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja DSSERR("request_irq failed\n"); 4746cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen return r; 4747affe360d13e54b415cde2f11cee02369b4ed54bdArchit Taneja } 47483de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 47495ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja /* DSI VCs initialization */ 4750f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja for (i = 0; i < ARRAY_SIZE(dsi->vc); i++) { 4751d604914484ccaaf33361558c9eb2abb441cf9d25Archit Taneja dsi->vc[i].source = DSI_VC_SOURCE_L4; 4752f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->vc[i].dssdev = NULL; 4753f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->vc[i].vc_id = 0; 47545ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja } 47555ee3c1445dd89342ca8498c14afef82d0f76c794Archit Taneja 4756a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dsi_calc_clock_param_ranges(dsidev); 475749641116392ad7522fa0efad53f7ed63f811bd88Archit Taneja 4758cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen r = dsi_get_clocks(dsidev); 4759cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen if (r) 4760cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen return r; 4761cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen 4762cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen pm_runtime_enable(&dsidev->dev); 4763cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen 47644fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen r = dsi_runtime_get(dsidev); 47654fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen if (r) 4766cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen goto err_runtime_get; 47673de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4768a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja rev = dsi_read_reg(dsidev, DSI_REVISION); 4769a72b64b99918ee801a3a6abf5391e356752bcad0Archit Taneja dev_dbg(&dsidev->dev, "OMAP DSI rev %d.%d\n", 47703de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen FLD_GET(rev, 7, 4), FLD_GET(rev, 3, 0)); 47713de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 4772d982085050e67da24a57ec04eb3701eb4805118aTomi Valkeinen /* DSI on OMAP3 doesn't have register DSI_GNQ, set number 4773d982085050e67da24a57ec04eb3701eb4805118aTomi Valkeinen * of data to 3 by default */ 4774d982085050e67da24a57ec04eb3701eb4805118aTomi Valkeinen if (dss_has_feature(FEAT_DSI_GNQ)) 4775d982085050e67da24a57ec04eb3701eb4805118aTomi Valkeinen /* NB_DATA_LANES */ 4776d982085050e67da24a57ec04eb3701eb4805118aTomi Valkeinen dsi->num_lanes_supported = 1 + REG_GET(dsidev, DSI_GNQ, 11, 9); 4777d982085050e67da24a57ec04eb3701eb4805118aTomi Valkeinen else 4778d982085050e67da24a57ec04eb3701eb4805118aTomi Valkeinen dsi->num_lanes_supported = 3; 477975d7247c07d27d046323504e2dbca5b3e94fbeceArchit Taneja 47804fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dsi_runtime_put(dsidev); 47813de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 47823de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return 0; 47834fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 4784cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinenerr_runtime_get: 47854fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen pm_runtime_disable(&dsidev->dev); 4786cd3b34493f9b5de1d617e0be39f6cb5c59c9889cTomi Valkeinen dsi_put_clocks(dsidev); 47873de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen return r; 47883de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen} 47893de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen 47907c68dd96d5a5eefe3ff6d9b94fc98fd9378aff1fTomi Valkeinenstatic int omap_dsihw_remove(struct platform_device *dsidev) 47913de7a1dc0c9d29b138713ecb85df4b6ca3af2ef3Tomi Valkeinen{ 4792f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja struct dsi_data *dsi = dsi_get_dsidrv_data(dsidev); 4793f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja 4794b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen WARN_ON(dsi->scp_clk_refcount > 0); 4795b98482ed73810c4a970dee3402b35241d3ce4b7eTomi Valkeinen 47964fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen pm_runtime_disable(&dsidev->dev); 47974fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 47984fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dsi_put_clocks(dsidev); 47994fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 4800f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (dsi->vdds_dsi_reg != NULL) { 4801f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja if (dsi->vdds_dsi_enabled) { 4802f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja regulator_disable(dsi->vdds_dsi_reg); 4803f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->vdds_dsi_enabled = false; 480488257b26953f73f30acf49587cb42b84be43c587Tomi Valkeinen } 480588257b26953f73f30acf49587cb42b84be43c587Tomi Valkeinen 4806f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja regulator_put(dsi->vdds_dsi_reg); 4807f1da39d9ce8490c5652768180454a816eb043b48Archit Taneja dsi->vdds_dsi_reg = NULL; 4808c8aac01b7bd1109795586db11ea7f12ab1e2d163Senthilvadivu Guruswamy } 4809c8aac01b7bd1109795586db11ea7f12ab1e2d163Senthilvadivu Guruswamy 4810c8aac01b7bd1109795586db11ea7f12ab1e2d163Senthilvadivu Guruswamy return 0; 4811c8aac01b7bd1109795586db11ea7f12ab1e2d163Senthilvadivu Guruswamy} 4812c8aac01b7bd1109795586db11ea7f12ab1e2d163Senthilvadivu Guruswamy 48134fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic int dsi_runtime_suspend(struct device *dev) 48144fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen{ 48154fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dispc_runtime_put(); 48164fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dss_runtime_put(); 48174fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 48184fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen return 0; 48194fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen} 48204fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 48214fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic int dsi_runtime_resume(struct device *dev) 48224fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen{ 48234fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen int r; 48244fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 48254fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen r = dss_runtime_get(); 48264fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen if (r) 48274fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen goto err_get_dss; 48284fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 48294fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen r = dispc_runtime_get(); 48304fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen if (r) 48314fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen goto err_get_dispc; 48324fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 48334fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen return 0; 48344fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 48354fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenerr_get_dispc: 48364fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen dss_runtime_put(); 48374fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenerr_get_dss: 48384fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen return r; 48394fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen} 48404fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 48414fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinenstatic const struct dev_pm_ops dsi_pm_ops = { 48424fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen .runtime_suspend = dsi_runtime_suspend, 48434fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen .runtime_resume = dsi_runtime_resume, 48444fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen}; 48454fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen 48467c68dd96d5a5eefe3ff6d9b94fc98fd9378aff1fTomi Valkeinenstatic struct platform_driver omap_dsihw_driver = { 48477c68dd96d5a5eefe3ff6d9b94fc98fd9378aff1fTomi Valkeinen .probe = omap_dsihw_probe, 48487c68dd96d5a5eefe3ff6d9b94fc98fd9378aff1fTomi Valkeinen .remove = omap_dsihw_remove, 4849c8aac01b7bd1109795586db11ea7f12ab1e2d163Senthilvadivu Guruswamy .driver = { 48507c68dd96d5a5eefe3ff6d9b94fc98fd9378aff1fTomi Valkeinen .name = "omapdss_dsi", 4851c8aac01b7bd1109795586db11ea7f12ab1e2d163Senthilvadivu Guruswamy .owner = THIS_MODULE, 48524fbafaf371be780ed2cd73a520dfeafa1ea73e24Tomi Valkeinen .pm = &dsi_pm_ops, 4853c8aac01b7bd1109795586db11ea7f12ab1e2d163Senthilvadivu Guruswamy }, 4854c8aac01b7bd1109795586db11ea7f12ab1e2d163Senthilvadivu Guruswamy}; 4855c8aac01b7bd1109795586db11ea7f12ab1e2d163Senthilvadivu Guruswamy 4856c8aac01b7bd1109795586db11ea7f12ab1e2d163Senthilvadivu Guruswamyint dsi_init_platform_driver(void) 4857c8aac01b7bd1109795586db11ea7f12ab1e2d163Senthilvadivu Guruswamy{ 48587c68dd96d5a5eefe3ff6d9b94fc98fd9378aff1fTomi Valkeinen return platform_driver_register(&omap_dsihw_driver); 4859c8aac01b7bd1109795586db11ea7f12ab1e2d163Senthilvadivu Guruswamy} 4860c8aac01b7bd1109795586db11ea7f12ab1e2d163Senthilvadivu Guruswamy 4861c8aac01b7bd1109795586db11ea7f12ab1e2d163Senthilvadivu Guruswamyvoid dsi_uninit_platform_driver(void) 4862c8aac01b7bd1109795586db11ea7f12ab1e2d163Senthilvadivu Guruswamy{ 48637c68dd96d5a5eefe3ff6d9b94fc98fd9378aff1fTomi Valkeinen return platform_driver_unregister(&omap_dsihw_driver); 4864c8aac01b7bd1109795586db11ea7f12ab1e2d163Senthilvadivu Guruswamy} 4865