Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v3.1-rc5 2070 lines 55 kB view raw
1/* 2 * Copyright (C) STMicroelectronics 2009 3 * Copyright (C) ST-Ericsson SA 2010 4 * 5 * License Terms: GNU General Public License v2 6 * Author: Kumar Sanghvi <kumar.sanghvi@stericsson.com> 7 * Author: Sundar Iyer <sundar.iyer@stericsson.com> 8 * Author: Mattias Nilsson <mattias.i.nilsson@stericsson.com> 9 * 10 * U8500 PRCM Unit interface driver 11 * 12 */ 13#include <linux/module.h> 14#include <linux/kernel.h> 15#include <linux/delay.h> 16#include <linux/errno.h> 17#include <linux/err.h> 18#include <linux/spinlock.h> 19#include <linux/io.h> 20#include <linux/slab.h> 21#include <linux/mutex.h> 22#include <linux/completion.h> 23#include <linux/irq.h> 24#include <linux/jiffies.h> 25#include <linux/bitops.h> 26#include <linux/fs.h> 27#include <linux/platform_device.h> 28#include <linux/uaccess.h> 29#include <linux/mfd/core.h> 30#include <linux/mfd/db8500-prcmu.h> 31#include <linux/regulator/db8500-prcmu.h> 32#include <linux/regulator/machine.h> 33#include <mach/hardware.h> 34#include <mach/irqs.h> 35#include <mach/db8500-regs.h> 36#include <mach/id.h> 37#include "db8500-prcmu-regs.h" 38 39/* Offset for the firmware version within the TCPM */ 40#define PRCMU_FW_VERSION_OFFSET 0xA4 41 42/* PRCMU project numbers, defined by PRCMU FW */ 43#define PRCMU_PROJECT_ID_8500V1_0 1 44#define PRCMU_PROJECT_ID_8500V2_0 2 45#define PRCMU_PROJECT_ID_8400V2_0 3 46 47/* Index of different voltages to be used when accessing AVSData */ 48#define PRCM_AVS_BASE 0x2FC 49#define PRCM_AVS_VBB_RET (PRCM_AVS_BASE + 0x0) 50#define PRCM_AVS_VBB_MAX_OPP (PRCM_AVS_BASE + 0x1) 51#define PRCM_AVS_VBB_100_OPP (PRCM_AVS_BASE + 0x2) 52#define PRCM_AVS_VBB_50_OPP (PRCM_AVS_BASE + 0x3) 53#define PRCM_AVS_VARM_MAX_OPP (PRCM_AVS_BASE + 0x4) 54#define PRCM_AVS_VARM_100_OPP (PRCM_AVS_BASE + 0x5) 55#define PRCM_AVS_VARM_50_OPP (PRCM_AVS_BASE + 0x6) 56#define PRCM_AVS_VARM_RET (PRCM_AVS_BASE + 0x7) 57#define PRCM_AVS_VAPE_100_OPP (PRCM_AVS_BASE + 0x8) 58#define PRCM_AVS_VAPE_50_OPP (PRCM_AVS_BASE + 0x9) 59#define PRCM_AVS_VMOD_100_OPP (PRCM_AVS_BASE + 0xA) 60#define PRCM_AVS_VMOD_50_OPP (PRCM_AVS_BASE + 0xB) 61#define PRCM_AVS_VSAFE (PRCM_AVS_BASE + 0xC) 62 63#define PRCM_AVS_VOLTAGE 0 64#define PRCM_AVS_VOLTAGE_MASK 0x3f 65#define PRCM_AVS_ISSLOWSTARTUP 6 66#define PRCM_AVS_ISSLOWSTARTUP_MASK (1 << PRCM_AVS_ISSLOWSTARTUP) 67#define PRCM_AVS_ISMODEENABLE 7 68#define PRCM_AVS_ISMODEENABLE_MASK (1 << PRCM_AVS_ISMODEENABLE) 69 70#define PRCM_BOOT_STATUS 0xFFF 71#define PRCM_ROMCODE_A2P 0xFFE 72#define PRCM_ROMCODE_P2A 0xFFD 73#define PRCM_XP70_CUR_PWR_STATE 0xFFC /* 4 BYTES */ 74 75#define PRCM_SW_RST_REASON 0xFF8 /* 2 bytes */ 76 77#define _PRCM_MBOX_HEADER 0xFE8 /* 16 bytes */ 78#define PRCM_MBOX_HEADER_REQ_MB0 (_PRCM_MBOX_HEADER + 0x0) 79#define PRCM_MBOX_HEADER_REQ_MB1 (_PRCM_MBOX_HEADER + 0x1) 80#define PRCM_MBOX_HEADER_REQ_MB2 (_PRCM_MBOX_HEADER + 0x2) 81#define PRCM_MBOX_HEADER_REQ_MB3 (_PRCM_MBOX_HEADER + 0x3) 82#define PRCM_MBOX_HEADER_REQ_MB4 (_PRCM_MBOX_HEADER + 0x4) 83#define PRCM_MBOX_HEADER_REQ_MB5 (_PRCM_MBOX_HEADER + 0x5) 84#define PRCM_MBOX_HEADER_ACK_MB0 (_PRCM_MBOX_HEADER + 0x8) 85 86/* Req Mailboxes */ 87#define PRCM_REQ_MB0 0xFDC /* 12 bytes */ 88#define PRCM_REQ_MB1 0xFD0 /* 12 bytes */ 89#define PRCM_REQ_MB2 0xFC0 /* 16 bytes */ 90#define PRCM_REQ_MB3 0xE4C /* 372 bytes */ 91#define PRCM_REQ_MB4 0xE48 /* 4 bytes */ 92#define PRCM_REQ_MB5 0xE44 /* 4 bytes */ 93 94/* Ack Mailboxes */ 95#define PRCM_ACK_MB0 0xE08 /* 52 bytes */ 96#define PRCM_ACK_MB1 0xE04 /* 4 bytes */ 97#define PRCM_ACK_MB2 0xE00 /* 4 bytes */ 98#define PRCM_ACK_MB3 0xDFC /* 4 bytes */ 99#define PRCM_ACK_MB4 0xDF8 /* 4 bytes */ 100#define PRCM_ACK_MB5 0xDF4 /* 4 bytes */ 101 102/* Mailbox 0 headers */ 103#define MB0H_POWER_STATE_TRANS 0 104#define MB0H_CONFIG_WAKEUPS_EXE 1 105#define MB0H_READ_WAKEUP_ACK 3 106#define MB0H_CONFIG_WAKEUPS_SLEEP 4 107 108#define MB0H_WAKEUP_EXE 2 109#define MB0H_WAKEUP_SLEEP 5 110 111/* Mailbox 0 REQs */ 112#define PRCM_REQ_MB0_AP_POWER_STATE (PRCM_REQ_MB0 + 0x0) 113#define PRCM_REQ_MB0_AP_PLL_STATE (PRCM_REQ_MB0 + 0x1) 114#define PRCM_REQ_MB0_ULP_CLOCK_STATE (PRCM_REQ_MB0 + 0x2) 115#define PRCM_REQ_MB0_DO_NOT_WFI (PRCM_REQ_MB0 + 0x3) 116#define PRCM_REQ_MB0_WAKEUP_8500 (PRCM_REQ_MB0 + 0x4) 117#define PRCM_REQ_MB0_WAKEUP_4500 (PRCM_REQ_MB0 + 0x8) 118 119/* Mailbox 0 ACKs */ 120#define PRCM_ACK_MB0_AP_PWRSTTR_STATUS (PRCM_ACK_MB0 + 0x0) 121#define PRCM_ACK_MB0_READ_POINTER (PRCM_ACK_MB0 + 0x1) 122#define PRCM_ACK_MB0_WAKEUP_0_8500 (PRCM_ACK_MB0 + 0x4) 123#define PRCM_ACK_MB0_WAKEUP_0_4500 (PRCM_ACK_MB0 + 0x8) 124#define PRCM_ACK_MB0_WAKEUP_1_8500 (PRCM_ACK_MB0 + 0x1C) 125#define PRCM_ACK_MB0_WAKEUP_1_4500 (PRCM_ACK_MB0 + 0x20) 126#define PRCM_ACK_MB0_EVENT_4500_NUMBERS 20 127 128/* Mailbox 1 headers */ 129#define MB1H_ARM_APE_OPP 0x0 130#define MB1H_RESET_MODEM 0x2 131#define MB1H_REQUEST_APE_OPP_100_VOLT 0x3 132#define MB1H_RELEASE_APE_OPP_100_VOLT 0x4 133#define MB1H_RELEASE_USB_WAKEUP 0x5 134 135/* Mailbox 1 Requests */ 136#define PRCM_REQ_MB1_ARM_OPP (PRCM_REQ_MB1 + 0x0) 137#define PRCM_REQ_MB1_APE_OPP (PRCM_REQ_MB1 + 0x1) 138#define PRCM_REQ_MB1_APE_OPP_100_RESTORE (PRCM_REQ_MB1 + 0x4) 139#define PRCM_REQ_MB1_ARM_OPP_100_RESTORE (PRCM_REQ_MB1 + 0x8) 140 141/* Mailbox 1 ACKs */ 142#define PRCM_ACK_MB1_CURRENT_ARM_OPP (PRCM_ACK_MB1 + 0x0) 143#define PRCM_ACK_MB1_CURRENT_APE_OPP (PRCM_ACK_MB1 + 0x1) 144#define PRCM_ACK_MB1_APE_VOLTAGE_STATUS (PRCM_ACK_MB1 + 0x2) 145#define PRCM_ACK_MB1_DVFS_STATUS (PRCM_ACK_MB1 + 0x3) 146 147/* Mailbox 2 headers */ 148#define MB2H_DPS 0x0 149#define MB2H_AUTO_PWR 0x1 150 151/* Mailbox 2 REQs */ 152#define PRCM_REQ_MB2_SVA_MMDSP (PRCM_REQ_MB2 + 0x0) 153#define PRCM_REQ_MB2_SVA_PIPE (PRCM_REQ_MB2 + 0x1) 154#define PRCM_REQ_MB2_SIA_MMDSP (PRCM_REQ_MB2 + 0x2) 155#define PRCM_REQ_MB2_SIA_PIPE (PRCM_REQ_MB2 + 0x3) 156#define PRCM_REQ_MB2_SGA (PRCM_REQ_MB2 + 0x4) 157#define PRCM_REQ_MB2_B2R2_MCDE (PRCM_REQ_MB2 + 0x5) 158#define PRCM_REQ_MB2_ESRAM12 (PRCM_REQ_MB2 + 0x6) 159#define PRCM_REQ_MB2_ESRAM34 (PRCM_REQ_MB2 + 0x7) 160#define PRCM_REQ_MB2_AUTO_PM_SLEEP (PRCM_REQ_MB2 + 0x8) 161#define PRCM_REQ_MB2_AUTO_PM_IDLE (PRCM_REQ_MB2 + 0xC) 162 163/* Mailbox 2 ACKs */ 164#define PRCM_ACK_MB2_DPS_STATUS (PRCM_ACK_MB2 + 0x0) 165#define HWACC_PWR_ST_OK 0xFE 166 167/* Mailbox 3 headers */ 168#define MB3H_ANC 0x0 169#define MB3H_SIDETONE 0x1 170#define MB3H_SYSCLK 0xE 171 172/* Mailbox 3 Requests */ 173#define PRCM_REQ_MB3_ANC_FIR_COEFF (PRCM_REQ_MB3 + 0x0) 174#define PRCM_REQ_MB3_ANC_IIR_COEFF (PRCM_REQ_MB3 + 0x20) 175#define PRCM_REQ_MB3_ANC_SHIFTER (PRCM_REQ_MB3 + 0x60) 176#define PRCM_REQ_MB3_ANC_WARP (PRCM_REQ_MB3 + 0x64) 177#define PRCM_REQ_MB3_SIDETONE_FIR_GAIN (PRCM_REQ_MB3 + 0x68) 178#define PRCM_REQ_MB3_SIDETONE_FIR_COEFF (PRCM_REQ_MB3 + 0x6C) 179#define PRCM_REQ_MB3_SYSCLK_MGT (PRCM_REQ_MB3 + 0x16C) 180 181/* Mailbox 4 headers */ 182#define MB4H_DDR_INIT 0x0 183#define MB4H_MEM_ST 0x1 184#define MB4H_HOTDOG 0x12 185#define MB4H_HOTMON 0x13 186#define MB4H_HOT_PERIOD 0x14 187 188/* Mailbox 4 Requests */ 189#define PRCM_REQ_MB4_DDR_ST_AP_SLEEP_IDLE (PRCM_REQ_MB4 + 0x0) 190#define PRCM_REQ_MB4_DDR_ST_AP_DEEP_IDLE (PRCM_REQ_MB4 + 0x1) 191#define PRCM_REQ_MB4_ESRAM0_ST (PRCM_REQ_MB4 + 0x3) 192#define PRCM_REQ_MB4_HOTDOG_THRESHOLD (PRCM_REQ_MB4 + 0x0) 193#define PRCM_REQ_MB4_HOTMON_LOW (PRCM_REQ_MB4 + 0x0) 194#define PRCM_REQ_MB4_HOTMON_HIGH (PRCM_REQ_MB4 + 0x1) 195#define PRCM_REQ_MB4_HOTMON_CONFIG (PRCM_REQ_MB4 + 0x2) 196#define PRCM_REQ_MB4_HOT_PERIOD (PRCM_REQ_MB4 + 0x0) 197#define HOTMON_CONFIG_LOW BIT(0) 198#define HOTMON_CONFIG_HIGH BIT(1) 199 200/* Mailbox 5 Requests */ 201#define PRCM_REQ_MB5_I2C_SLAVE_OP (PRCM_REQ_MB5 + 0x0) 202#define PRCM_REQ_MB5_I2C_HW_BITS (PRCM_REQ_MB5 + 0x1) 203#define PRCM_REQ_MB5_I2C_REG (PRCM_REQ_MB5 + 0x2) 204#define PRCM_REQ_MB5_I2C_VAL (PRCM_REQ_MB5 + 0x3) 205#define PRCMU_I2C_WRITE(slave) \ 206 (((slave) << 1) | (cpu_is_u8500v2() ? BIT(6) : 0)) 207#define PRCMU_I2C_READ(slave) \ 208 (((slave) << 1) | BIT(0) | (cpu_is_u8500v2() ? BIT(6) : 0)) 209#define PRCMU_I2C_STOP_EN BIT(3) 210 211/* Mailbox 5 ACKs */ 212#define PRCM_ACK_MB5_I2C_STATUS (PRCM_ACK_MB5 + 0x1) 213#define PRCM_ACK_MB5_I2C_VAL (PRCM_ACK_MB5 + 0x3) 214#define I2C_WR_OK 0x1 215#define I2C_RD_OK 0x2 216 217#define NUM_MB 8 218#define MBOX_BIT BIT 219#define ALL_MBOX_BITS (MBOX_BIT(NUM_MB) - 1) 220 221/* 222 * Wakeups/IRQs 223 */ 224 225#define WAKEUP_BIT_RTC BIT(0) 226#define WAKEUP_BIT_RTT0 BIT(1) 227#define WAKEUP_BIT_RTT1 BIT(2) 228#define WAKEUP_BIT_HSI0 BIT(3) 229#define WAKEUP_BIT_HSI1 BIT(4) 230#define WAKEUP_BIT_CA_WAKE BIT(5) 231#define WAKEUP_BIT_USB BIT(6) 232#define WAKEUP_BIT_ABB BIT(7) 233#define WAKEUP_BIT_ABB_FIFO BIT(8) 234#define WAKEUP_BIT_SYSCLK_OK BIT(9) 235#define WAKEUP_BIT_CA_SLEEP BIT(10) 236#define WAKEUP_BIT_AC_WAKE_ACK BIT(11) 237#define WAKEUP_BIT_SIDE_TONE_OK BIT(12) 238#define WAKEUP_BIT_ANC_OK BIT(13) 239#define WAKEUP_BIT_SW_ERROR BIT(14) 240#define WAKEUP_BIT_AC_SLEEP_ACK BIT(15) 241#define WAKEUP_BIT_ARM BIT(17) 242#define WAKEUP_BIT_HOTMON_LOW BIT(18) 243#define WAKEUP_BIT_HOTMON_HIGH BIT(19) 244#define WAKEUP_BIT_MODEM_SW_RESET_REQ BIT(20) 245#define WAKEUP_BIT_GPIO0 BIT(23) 246#define WAKEUP_BIT_GPIO1 BIT(24) 247#define WAKEUP_BIT_GPIO2 BIT(25) 248#define WAKEUP_BIT_GPIO3 BIT(26) 249#define WAKEUP_BIT_GPIO4 BIT(27) 250#define WAKEUP_BIT_GPIO5 BIT(28) 251#define WAKEUP_BIT_GPIO6 BIT(29) 252#define WAKEUP_BIT_GPIO7 BIT(30) 253#define WAKEUP_BIT_GPIO8 BIT(31) 254 255/* 256 * This vector maps irq numbers to the bits in the bit field used in 257 * communication with the PRCMU firmware. 258 * 259 * The reason for having this is to keep the irq numbers contiguous even though 260 * the bits in the bit field are not. (The bits also have a tendency to move 261 * around, to further complicate matters.) 262 */ 263#define IRQ_INDEX(_name) ((IRQ_PRCMU_##_name) - IRQ_PRCMU_BASE) 264#define IRQ_ENTRY(_name)[IRQ_INDEX(_name)] = (WAKEUP_BIT_##_name) 265static u32 prcmu_irq_bit[NUM_PRCMU_WAKEUPS] = { 266 IRQ_ENTRY(RTC), 267 IRQ_ENTRY(RTT0), 268 IRQ_ENTRY(RTT1), 269 IRQ_ENTRY(HSI0), 270 IRQ_ENTRY(HSI1), 271 IRQ_ENTRY(CA_WAKE), 272 IRQ_ENTRY(USB), 273 IRQ_ENTRY(ABB), 274 IRQ_ENTRY(ABB_FIFO), 275 IRQ_ENTRY(CA_SLEEP), 276 IRQ_ENTRY(ARM), 277 IRQ_ENTRY(HOTMON_LOW), 278 IRQ_ENTRY(HOTMON_HIGH), 279 IRQ_ENTRY(MODEM_SW_RESET_REQ), 280 IRQ_ENTRY(GPIO0), 281 IRQ_ENTRY(GPIO1), 282 IRQ_ENTRY(GPIO2), 283 IRQ_ENTRY(GPIO3), 284 IRQ_ENTRY(GPIO4), 285 IRQ_ENTRY(GPIO5), 286 IRQ_ENTRY(GPIO6), 287 IRQ_ENTRY(GPIO7), 288 IRQ_ENTRY(GPIO8) 289}; 290 291#define VALID_WAKEUPS (BIT(NUM_PRCMU_WAKEUP_INDICES) - 1) 292#define WAKEUP_ENTRY(_name)[PRCMU_WAKEUP_INDEX_##_name] = (WAKEUP_BIT_##_name) 293static u32 prcmu_wakeup_bit[NUM_PRCMU_WAKEUP_INDICES] = { 294 WAKEUP_ENTRY(RTC), 295 WAKEUP_ENTRY(RTT0), 296 WAKEUP_ENTRY(RTT1), 297 WAKEUP_ENTRY(HSI0), 298 WAKEUP_ENTRY(HSI1), 299 WAKEUP_ENTRY(USB), 300 WAKEUP_ENTRY(ABB), 301 WAKEUP_ENTRY(ABB_FIFO), 302 WAKEUP_ENTRY(ARM) 303}; 304 305/* 306 * mb0_transfer - state needed for mailbox 0 communication. 307 * @lock: The transaction lock. 308 * @dbb_events_lock: A lock used to handle concurrent access to (parts of) 309 * the request data. 310 * @mask_work: Work structure used for (un)masking wakeup interrupts. 311 * @req: Request data that need to persist between requests. 312 */ 313static struct { 314 spinlock_t lock; 315 spinlock_t dbb_irqs_lock; 316 struct work_struct mask_work; 317 struct mutex ac_wake_lock; 318 struct completion ac_wake_work; 319 struct { 320 u32 dbb_irqs; 321 u32 dbb_wakeups; 322 u32 abb_events; 323 } req; 324} mb0_transfer; 325 326/* 327 * mb1_transfer - state needed for mailbox 1 communication. 328 * @lock: The transaction lock. 329 * @work: The transaction completion structure. 330 * @ack: Reply ("acknowledge") data. 331 */ 332static struct { 333 struct mutex lock; 334 struct completion work; 335 struct { 336 u8 header; 337 u8 arm_opp; 338 u8 ape_opp; 339 u8 ape_voltage_status; 340 } ack; 341} mb1_transfer; 342 343/* 344 * mb2_transfer - state needed for mailbox 2 communication. 345 * @lock: The transaction lock. 346 * @work: The transaction completion structure. 347 * @auto_pm_lock: The autonomous power management configuration lock. 348 * @auto_pm_enabled: A flag indicating whether autonomous PM is enabled. 349 * @req: Request data that need to persist between requests. 350 * @ack: Reply ("acknowledge") data. 351 */ 352static struct { 353 struct mutex lock; 354 struct completion work; 355 spinlock_t auto_pm_lock; 356 bool auto_pm_enabled; 357 struct { 358 u8 status; 359 } ack; 360} mb2_transfer; 361 362/* 363 * mb3_transfer - state needed for mailbox 3 communication. 364 * @lock: The request lock. 365 * @sysclk_lock: A lock used to handle concurrent sysclk requests. 366 * @sysclk_work: Work structure used for sysclk requests. 367 */ 368static struct { 369 spinlock_t lock; 370 struct mutex sysclk_lock; 371 struct completion sysclk_work; 372} mb3_transfer; 373 374/* 375 * mb4_transfer - state needed for mailbox 4 communication. 376 * @lock: The transaction lock. 377 * @work: The transaction completion structure. 378 */ 379static struct { 380 struct mutex lock; 381 struct completion work; 382} mb4_transfer; 383 384/* 385 * mb5_transfer - state needed for mailbox 5 communication. 386 * @lock: The transaction lock. 387 * @work: The transaction completion structure. 388 * @ack: Reply ("acknowledge") data. 389 */ 390static struct { 391 struct mutex lock; 392 struct completion work; 393 struct { 394 u8 status; 395 u8 value; 396 } ack; 397} mb5_transfer; 398 399static atomic_t ac_wake_req_state = ATOMIC_INIT(0); 400 401/* Spinlocks */ 402static DEFINE_SPINLOCK(clkout_lock); 403static DEFINE_SPINLOCK(gpiocr_lock); 404 405/* Global var to runtime determine TCDM base for v2 or v1 */ 406static __iomem void *tcdm_base; 407 408struct clk_mgt { 409 unsigned int offset; 410 u32 pllsw; 411}; 412 413static DEFINE_SPINLOCK(clk_mgt_lock); 414 415#define CLK_MGT_ENTRY(_name)[PRCMU_##_name] = { (PRCM_##_name##_MGT), 0 } 416struct clk_mgt clk_mgt[PRCMU_NUM_REG_CLOCKS] = { 417 CLK_MGT_ENTRY(SGACLK), 418 CLK_MGT_ENTRY(UARTCLK), 419 CLK_MGT_ENTRY(MSP02CLK), 420 CLK_MGT_ENTRY(MSP1CLK), 421 CLK_MGT_ENTRY(I2CCLK), 422 CLK_MGT_ENTRY(SDMMCCLK), 423 CLK_MGT_ENTRY(SLIMCLK), 424 CLK_MGT_ENTRY(PER1CLK), 425 CLK_MGT_ENTRY(PER2CLK), 426 CLK_MGT_ENTRY(PER3CLK), 427 CLK_MGT_ENTRY(PER5CLK), 428 CLK_MGT_ENTRY(PER6CLK), 429 CLK_MGT_ENTRY(PER7CLK), 430 CLK_MGT_ENTRY(LCDCLK), 431 CLK_MGT_ENTRY(BMLCLK), 432 CLK_MGT_ENTRY(HSITXCLK), 433 CLK_MGT_ENTRY(HSIRXCLK), 434 CLK_MGT_ENTRY(HDMICLK), 435 CLK_MGT_ENTRY(APEATCLK), 436 CLK_MGT_ENTRY(APETRACECLK), 437 CLK_MGT_ENTRY(MCDECLK), 438 CLK_MGT_ENTRY(IPI2CCLK), 439 CLK_MGT_ENTRY(DSIALTCLK), 440 CLK_MGT_ENTRY(DMACLK), 441 CLK_MGT_ENTRY(B2R2CLK), 442 CLK_MGT_ENTRY(TVCLK), 443 CLK_MGT_ENTRY(SSPCLK), 444 CLK_MGT_ENTRY(RNGCLK), 445 CLK_MGT_ENTRY(UICCCLK), 446}; 447 448/* 449* Used by MCDE to setup all necessary PRCMU registers 450*/ 451#define PRCMU_RESET_DSIPLL 0x00004000 452#define PRCMU_UNCLAMP_DSIPLL 0x00400800 453 454#define PRCMU_CLK_PLL_DIV_SHIFT 0 455#define PRCMU_CLK_PLL_SW_SHIFT 5 456#define PRCMU_CLK_38 (1 << 9) 457#define PRCMU_CLK_38_SRC (1 << 10) 458#define PRCMU_CLK_38_DIV (1 << 11) 459 460/* PLLDIV=12, PLLSW=4 (PLLDDR) */ 461#define PRCMU_DSI_CLOCK_SETTING 0x0000008C 462 463/* PLLDIV=8, PLLSW=4 (PLLDDR) */ 464#define PRCMU_DSI_CLOCK_SETTING_U8400 0x00000088 465 466/* DPI 50000000 Hz */ 467#define PRCMU_DPI_CLOCK_SETTING ((1 << PRCMU_CLK_PLL_SW_SHIFT) | \ 468 (16 << PRCMU_CLK_PLL_DIV_SHIFT)) 469#define PRCMU_DSI_LP_CLOCK_SETTING 0x00000E00 470 471/* D=101, N=1, R=4, SELDIV2=0 */ 472#define PRCMU_PLLDSI_FREQ_SETTING 0x00040165 473 474/* D=70, N=1, R=3, SELDIV2=0 */ 475#define PRCMU_PLLDSI_FREQ_SETTING_U8400 0x00030146 476 477#define PRCMU_ENABLE_PLLDSI 0x00000001 478#define PRCMU_DISABLE_PLLDSI 0x00000000 479#define PRCMU_RELEASE_RESET_DSS 0x0000400C 480#define PRCMU_DSI_PLLOUT_SEL_SETTING 0x00000202 481/* ESC clk, div0=1, div1=1, div2=3 */ 482#define PRCMU_ENABLE_ESCAPE_CLOCK_DIV 0x07030101 483#define PRCMU_DISABLE_ESCAPE_CLOCK_DIV 0x00030101 484#define PRCMU_DSI_RESET_SW 0x00000007 485 486#define PRCMU_PLLDSI_LOCKP_LOCKED 0x3 487 488static struct { 489 u8 project_number; 490 u8 api_version; 491 u8 func_version; 492 u8 errata; 493} prcmu_version; 494 495 496int prcmu_enable_dsipll(void) 497{ 498 int i; 499 unsigned int plldsifreq; 500 501 /* Clear DSIPLL_RESETN */ 502 writel(PRCMU_RESET_DSIPLL, (_PRCMU_BASE + PRCM_APE_RESETN_CLR)); 503 /* Unclamp DSIPLL in/out */ 504 writel(PRCMU_UNCLAMP_DSIPLL, (_PRCMU_BASE + PRCM_MMIP_LS_CLAMP_CLR)); 505 506 if (prcmu_is_u8400()) 507 plldsifreq = PRCMU_PLLDSI_FREQ_SETTING_U8400; 508 else 509 plldsifreq = PRCMU_PLLDSI_FREQ_SETTING; 510 /* Set DSI PLL FREQ */ 511 writel(plldsifreq, (_PRCMU_BASE + PRCM_PLLDSI_FREQ)); 512 writel(PRCMU_DSI_PLLOUT_SEL_SETTING, 513 (_PRCMU_BASE + PRCM_DSI_PLLOUT_SEL)); 514 /* Enable Escape clocks */ 515 writel(PRCMU_ENABLE_ESCAPE_CLOCK_DIV, 516 (_PRCMU_BASE + PRCM_DSITVCLK_DIV)); 517 518 /* Start DSI PLL */ 519 writel(PRCMU_ENABLE_PLLDSI, (_PRCMU_BASE + PRCM_PLLDSI_ENABLE)); 520 /* Reset DSI PLL */ 521 writel(PRCMU_DSI_RESET_SW, (_PRCMU_BASE + PRCM_DSI_SW_RESET)); 522 for (i = 0; i < 10; i++) { 523 if ((readl(_PRCMU_BASE + PRCM_PLLDSI_LOCKP) & 524 PRCMU_PLLDSI_LOCKP_LOCKED) 525 == PRCMU_PLLDSI_LOCKP_LOCKED) 526 break; 527 udelay(100); 528 } 529 /* Set DSIPLL_RESETN */ 530 writel(PRCMU_RESET_DSIPLL, (_PRCMU_BASE + PRCM_APE_RESETN_SET)); 531 return 0; 532} 533 534int prcmu_disable_dsipll(void) 535{ 536 /* Disable dsi pll */ 537 writel(PRCMU_DISABLE_PLLDSI, (_PRCMU_BASE + PRCM_PLLDSI_ENABLE)); 538 /* Disable escapeclock */ 539 writel(PRCMU_DISABLE_ESCAPE_CLOCK_DIV, 540 (_PRCMU_BASE + PRCM_DSITVCLK_DIV)); 541 return 0; 542} 543 544int prcmu_set_display_clocks(void) 545{ 546 unsigned long flags; 547 unsigned int dsiclk; 548 549 if (prcmu_is_u8400()) 550 dsiclk = PRCMU_DSI_CLOCK_SETTING_U8400; 551 else 552 dsiclk = PRCMU_DSI_CLOCK_SETTING; 553 554 spin_lock_irqsave(&clk_mgt_lock, flags); 555 556 /* Grab the HW semaphore. */ 557 while ((readl(_PRCMU_BASE + PRCM_SEM) & PRCM_SEM_PRCM_SEM) != 0) 558 cpu_relax(); 559 560 writel(dsiclk, (_PRCMU_BASE + PRCM_HDMICLK_MGT)); 561 writel(PRCMU_DSI_LP_CLOCK_SETTING, (_PRCMU_BASE + PRCM_TVCLK_MGT)); 562 writel(PRCMU_DPI_CLOCK_SETTING, (_PRCMU_BASE + PRCM_LCDCLK_MGT)); 563 564 /* Release the HW semaphore. */ 565 writel(0, (_PRCMU_BASE + PRCM_SEM)); 566 567 spin_unlock_irqrestore(&clk_mgt_lock, flags); 568 569 return 0; 570} 571 572/** 573 * prcmu_enable_spi2 - Enables pin muxing for SPI2 on OtherAlternateC1. 574 */ 575void prcmu_enable_spi2(void) 576{ 577 u32 reg; 578 unsigned long flags; 579 580 spin_lock_irqsave(&gpiocr_lock, flags); 581 reg = readl(_PRCMU_BASE + PRCM_GPIOCR); 582 writel(reg | PRCM_GPIOCR_SPI2_SELECT, _PRCMU_BASE + PRCM_GPIOCR); 583 spin_unlock_irqrestore(&gpiocr_lock, flags); 584} 585 586/** 587 * prcmu_disable_spi2 - Disables pin muxing for SPI2 on OtherAlternateC1. 588 */ 589void prcmu_disable_spi2(void) 590{ 591 u32 reg; 592 unsigned long flags; 593 594 spin_lock_irqsave(&gpiocr_lock, flags); 595 reg = readl(_PRCMU_BASE + PRCM_GPIOCR); 596 writel(reg & ~PRCM_GPIOCR_SPI2_SELECT, _PRCMU_BASE + PRCM_GPIOCR); 597 spin_unlock_irqrestore(&gpiocr_lock, flags); 598} 599 600bool prcmu_has_arm_maxopp(void) 601{ 602 return (readb(tcdm_base + PRCM_AVS_VARM_MAX_OPP) & 603 PRCM_AVS_ISMODEENABLE_MASK) == PRCM_AVS_ISMODEENABLE_MASK; 604} 605 606bool prcmu_is_u8400(void) 607{ 608 return prcmu_version.project_number == PRCMU_PROJECT_ID_8400V2_0; 609} 610 611/** 612 * prcmu_get_boot_status - PRCMU boot status checking 613 * Returns: the current PRCMU boot status 614 */ 615int prcmu_get_boot_status(void) 616{ 617 return readb(tcdm_base + PRCM_BOOT_STATUS); 618} 619 620/** 621 * prcmu_set_rc_a2p - This function is used to run few power state sequences 622 * @val: Value to be set, i.e. transition requested 623 * Returns: 0 on success, -EINVAL on invalid argument 624 * 625 * This function is used to run the following power state sequences - 626 * any state to ApReset, ApDeepSleep to ApExecute, ApExecute to ApDeepSleep 627 */ 628int prcmu_set_rc_a2p(enum romcode_write val) 629{ 630 if (val < RDY_2_DS || val > RDY_2_XP70_RST) 631 return -EINVAL; 632 writeb(val, (tcdm_base + PRCM_ROMCODE_A2P)); 633 return 0; 634} 635 636/** 637 * prcmu_get_rc_p2a - This function is used to get power state sequences 638 * Returns: the power transition that has last happened 639 * 640 * This function can return the following transitions- 641 * any state to ApReset, ApDeepSleep to ApExecute, ApExecute to ApDeepSleep 642 */ 643enum romcode_read prcmu_get_rc_p2a(void) 644{ 645 return readb(tcdm_base + PRCM_ROMCODE_P2A); 646} 647 648/** 649 * prcmu_get_current_mode - Return the current XP70 power mode 650 * Returns: Returns the current AP(ARM) power mode: init, 651 * apBoot, apExecute, apDeepSleep, apSleep, apIdle, apReset 652 */ 653enum ap_pwrst prcmu_get_xp70_current_state(void) 654{ 655 return readb(tcdm_base + PRCM_XP70_CUR_PWR_STATE); 656} 657 658/** 659 * prcmu_config_clkout - Configure one of the programmable clock outputs. 660 * @clkout: The CLKOUT number (0 or 1). 661 * @source: The clock to be used (one of the PRCMU_CLKSRC_*). 662 * @div: The divider to be applied. 663 * 664 * Configures one of the programmable clock outputs (CLKOUTs). 665 * @div should be in the range [1,63] to request a configuration, or 0 to 666 * inform that the configuration is no longer requested. 667 */ 668int prcmu_config_clkout(u8 clkout, u8 source, u8 div) 669{ 670 static int requests[2]; 671 int r = 0; 672 unsigned long flags; 673 u32 val; 674 u32 bits; 675 u32 mask; 676 u32 div_mask; 677 678 BUG_ON(clkout > 1); 679 BUG_ON(div > 63); 680 BUG_ON((clkout == 0) && (source > PRCMU_CLKSRC_CLK009)); 681 682 if (!div && !requests[clkout]) 683 return -EINVAL; 684 685 switch (clkout) { 686 case 0: 687 div_mask = PRCM_CLKOCR_CLKODIV0_MASK; 688 mask = (PRCM_CLKOCR_CLKODIV0_MASK | PRCM_CLKOCR_CLKOSEL0_MASK); 689 bits = ((source << PRCM_CLKOCR_CLKOSEL0_SHIFT) | 690 (div << PRCM_CLKOCR_CLKODIV0_SHIFT)); 691 break; 692 case 1: 693 div_mask = PRCM_CLKOCR_CLKODIV1_MASK; 694 mask = (PRCM_CLKOCR_CLKODIV1_MASK | PRCM_CLKOCR_CLKOSEL1_MASK | 695 PRCM_CLKOCR_CLK1TYPE); 696 bits = ((source << PRCM_CLKOCR_CLKOSEL1_SHIFT) | 697 (div << PRCM_CLKOCR_CLKODIV1_SHIFT)); 698 break; 699 } 700 bits &= mask; 701 702 spin_lock_irqsave(&clkout_lock, flags); 703 704 val = readl(_PRCMU_BASE + PRCM_CLKOCR); 705 if (val & div_mask) { 706 if (div) { 707 if ((val & mask) != bits) { 708 r = -EBUSY; 709 goto unlock_and_return; 710 } 711 } else { 712 if ((val & mask & ~div_mask) != bits) { 713 r = -EINVAL; 714 goto unlock_and_return; 715 } 716 } 717 } 718 writel((bits | (val & ~mask)), (_PRCMU_BASE + PRCM_CLKOCR)); 719 requests[clkout] += (div ? 1 : -1); 720 721unlock_and_return: 722 spin_unlock_irqrestore(&clkout_lock, flags); 723 724 return r; 725} 726 727int prcmu_set_power_state(u8 state, bool keep_ulp_clk, bool keep_ap_pll) 728{ 729 unsigned long flags; 730 731 BUG_ON((state < PRCMU_AP_SLEEP) || (PRCMU_AP_DEEP_IDLE < state)); 732 733 spin_lock_irqsave(&mb0_transfer.lock, flags); 734 735 while (readl(_PRCMU_BASE + PRCM_MBOX_CPU_VAL) & MBOX_BIT(0)) 736 cpu_relax(); 737 738 writeb(MB0H_POWER_STATE_TRANS, (tcdm_base + PRCM_MBOX_HEADER_REQ_MB0)); 739 writeb(state, (tcdm_base + PRCM_REQ_MB0_AP_POWER_STATE)); 740 writeb((keep_ap_pll ? 1 : 0), (tcdm_base + PRCM_REQ_MB0_AP_PLL_STATE)); 741 writeb((keep_ulp_clk ? 1 : 0), 742 (tcdm_base + PRCM_REQ_MB0_ULP_CLOCK_STATE)); 743 writeb(0, (tcdm_base + PRCM_REQ_MB0_DO_NOT_WFI)); 744 writel(MBOX_BIT(0), (_PRCMU_BASE + PRCM_MBOX_CPU_SET)); 745 746 spin_unlock_irqrestore(&mb0_transfer.lock, flags); 747 748 return 0; 749} 750 751/* This function should only be called while mb0_transfer.lock is held. */ 752static void config_wakeups(void) 753{ 754 const u8 header[2] = { 755 MB0H_CONFIG_WAKEUPS_EXE, 756 MB0H_CONFIG_WAKEUPS_SLEEP 757 }; 758 static u32 last_dbb_events; 759 static u32 last_abb_events; 760 u32 dbb_events; 761 u32 abb_events; 762 unsigned int i; 763 764 dbb_events = mb0_transfer.req.dbb_irqs | mb0_transfer.req.dbb_wakeups; 765 dbb_events |= (WAKEUP_BIT_AC_WAKE_ACK | WAKEUP_BIT_AC_SLEEP_ACK); 766 767 abb_events = mb0_transfer.req.abb_events; 768 769 if ((dbb_events == last_dbb_events) && (abb_events == last_abb_events)) 770 return; 771 772 for (i = 0; i < 2; i++) { 773 while (readl(_PRCMU_BASE + PRCM_MBOX_CPU_VAL) & MBOX_BIT(0)) 774 cpu_relax(); 775 writel(dbb_events, (tcdm_base + PRCM_REQ_MB0_WAKEUP_8500)); 776 writel(abb_events, (tcdm_base + PRCM_REQ_MB0_WAKEUP_4500)); 777 writeb(header[i], (tcdm_base + PRCM_MBOX_HEADER_REQ_MB0)); 778 writel(MBOX_BIT(0), (_PRCMU_BASE + PRCM_MBOX_CPU_SET)); 779 } 780 last_dbb_events = dbb_events; 781 last_abb_events = abb_events; 782} 783 784void prcmu_enable_wakeups(u32 wakeups) 785{ 786 unsigned long flags; 787 u32 bits; 788 int i; 789 790 BUG_ON(wakeups != (wakeups & VALID_WAKEUPS)); 791 792 for (i = 0, bits = 0; i < NUM_PRCMU_WAKEUP_INDICES; i++) { 793 if (wakeups & BIT(i)) 794 bits |= prcmu_wakeup_bit[i]; 795 } 796 797 spin_lock_irqsave(&mb0_transfer.lock, flags); 798 799 mb0_transfer.req.dbb_wakeups = bits; 800 config_wakeups(); 801 802 spin_unlock_irqrestore(&mb0_transfer.lock, flags); 803} 804 805void prcmu_config_abb_event_readout(u32 abb_events) 806{ 807 unsigned long flags; 808 809 spin_lock_irqsave(&mb0_transfer.lock, flags); 810 811 mb0_transfer.req.abb_events = abb_events; 812 config_wakeups(); 813 814 spin_unlock_irqrestore(&mb0_transfer.lock, flags); 815} 816 817void prcmu_get_abb_event_buffer(void __iomem **buf) 818{ 819 if (readb(tcdm_base + PRCM_ACK_MB0_READ_POINTER) & 1) 820 *buf = (tcdm_base + PRCM_ACK_MB0_WAKEUP_1_4500); 821 else 822 *buf = (tcdm_base + PRCM_ACK_MB0_WAKEUP_0_4500); 823} 824 825/** 826 * prcmu_set_arm_opp - set the appropriate ARM OPP 827 * @opp: The new ARM operating point to which transition is to be made 828 * Returns: 0 on success, non-zero on failure 829 * 830 * This function sets the the operating point of the ARM. 831 */ 832int prcmu_set_arm_opp(u8 opp) 833{ 834 int r; 835 836 if (opp < ARM_NO_CHANGE || opp > ARM_EXTCLK) 837 return -EINVAL; 838 839 r = 0; 840 841 mutex_lock(&mb1_transfer.lock); 842 843 while (readl(_PRCMU_BASE + PRCM_MBOX_CPU_VAL) & MBOX_BIT(1)) 844 cpu_relax(); 845 846 writeb(MB1H_ARM_APE_OPP, (tcdm_base + PRCM_MBOX_HEADER_REQ_MB1)); 847 writeb(opp, (tcdm_base + PRCM_REQ_MB1_ARM_OPP)); 848 writeb(APE_NO_CHANGE, (tcdm_base + PRCM_REQ_MB1_APE_OPP)); 849 850 writel(MBOX_BIT(1), (_PRCMU_BASE + PRCM_MBOX_CPU_SET)); 851 wait_for_completion(&mb1_transfer.work); 852 853 if ((mb1_transfer.ack.header != MB1H_ARM_APE_OPP) || 854 (mb1_transfer.ack.arm_opp != opp)) 855 r = -EIO; 856 857 mutex_unlock(&mb1_transfer.lock); 858 859 return r; 860} 861 862/** 863 * prcmu_get_arm_opp - get the current ARM OPP 864 * 865 * Returns: the current ARM OPP 866 */ 867int prcmu_get_arm_opp(void) 868{ 869 return readb(tcdm_base + PRCM_ACK_MB1_CURRENT_ARM_OPP); 870} 871 872/** 873 * prcmu_get_ddr_opp - get the current DDR OPP 874 * 875 * Returns: the current DDR OPP 876 */ 877int prcmu_get_ddr_opp(void) 878{ 879 return readb(_PRCMU_BASE + PRCM_DDR_SUBSYS_APE_MINBW); 880} 881 882/** 883 * set_ddr_opp - set the appropriate DDR OPP 884 * @opp: The new DDR operating point to which transition is to be made 885 * Returns: 0 on success, non-zero on failure 886 * 887 * This function sets the operating point of the DDR. 888 */ 889int prcmu_set_ddr_opp(u8 opp) 890{ 891 if (opp < DDR_100_OPP || opp > DDR_25_OPP) 892 return -EINVAL; 893 /* Changing the DDR OPP can hang the hardware pre-v21 */ 894 if (cpu_is_u8500v20_or_later() && !cpu_is_u8500v20()) 895 writeb(opp, (_PRCMU_BASE + PRCM_DDR_SUBSYS_APE_MINBW)); 896 897 return 0; 898} 899/** 900 * set_ape_opp - set the appropriate APE OPP 901 * @opp: The new APE operating point to which transition is to be made 902 * Returns: 0 on success, non-zero on failure 903 * 904 * This function sets the operating point of the APE. 905 */ 906int prcmu_set_ape_opp(u8 opp) 907{ 908 int r = 0; 909 910 mutex_lock(&mb1_transfer.lock); 911 912 while (readl(_PRCMU_BASE + PRCM_MBOX_CPU_VAL) & MBOX_BIT(1)) 913 cpu_relax(); 914 915 writeb(MB1H_ARM_APE_OPP, (tcdm_base + PRCM_MBOX_HEADER_REQ_MB1)); 916 writeb(ARM_NO_CHANGE, (tcdm_base + PRCM_REQ_MB1_ARM_OPP)); 917 writeb(opp, (tcdm_base + PRCM_REQ_MB1_APE_OPP)); 918 919 writel(MBOX_BIT(1), (_PRCMU_BASE + PRCM_MBOX_CPU_SET)); 920 wait_for_completion(&mb1_transfer.work); 921 922 if ((mb1_transfer.ack.header != MB1H_ARM_APE_OPP) || 923 (mb1_transfer.ack.ape_opp != opp)) 924 r = -EIO; 925 926 mutex_unlock(&mb1_transfer.lock); 927 928 return r; 929} 930 931/** 932 * prcmu_get_ape_opp - get the current APE OPP 933 * 934 * Returns: the current APE OPP 935 */ 936int prcmu_get_ape_opp(void) 937{ 938 return readb(tcdm_base + PRCM_ACK_MB1_CURRENT_APE_OPP); 939} 940 941/** 942 * prcmu_request_ape_opp_100_voltage - Request APE OPP 100% voltage 943 * @enable: true to request the higher voltage, false to drop a request. 944 * 945 * Calls to this function to enable and disable requests must be balanced. 946 */ 947int prcmu_request_ape_opp_100_voltage(bool enable) 948{ 949 int r = 0; 950 u8 header; 951 static unsigned int requests; 952 953 mutex_lock(&mb1_transfer.lock); 954 955 if (enable) { 956 if (0 != requests++) 957 goto unlock_and_return; 958 header = MB1H_REQUEST_APE_OPP_100_VOLT; 959 } else { 960 if (requests == 0) { 961 r = -EIO; 962 goto unlock_and_return; 963 } else if (1 != requests--) { 964 goto unlock_and_return; 965 } 966 header = MB1H_RELEASE_APE_OPP_100_VOLT; 967 } 968 969 while (readl(_PRCMU_BASE + PRCM_MBOX_CPU_VAL) & MBOX_BIT(1)) 970 cpu_relax(); 971 972 writeb(header, (tcdm_base + PRCM_MBOX_HEADER_REQ_MB1)); 973 974 writel(MBOX_BIT(1), (_PRCMU_BASE + PRCM_MBOX_CPU_SET)); 975 wait_for_completion(&mb1_transfer.work); 976 977 if ((mb1_transfer.ack.header != header) || 978 ((mb1_transfer.ack.ape_voltage_status & BIT(0)) != 0)) 979 r = -EIO; 980 981unlock_and_return: 982 mutex_unlock(&mb1_transfer.lock); 983 984 return r; 985} 986 987/** 988 * prcmu_release_usb_wakeup_state - release the state required by a USB wakeup 989 * 990 * This function releases the power state requirements of a USB wakeup. 991 */ 992int prcmu_release_usb_wakeup_state(void) 993{ 994 int r = 0; 995 996 mutex_lock(&mb1_transfer.lock); 997 998 while (readl(_PRCMU_BASE + PRCM_MBOX_CPU_VAL) & MBOX_BIT(1)) 999 cpu_relax(); 1000 1001 writeb(MB1H_RELEASE_USB_WAKEUP, 1002 (tcdm_base + PRCM_MBOX_HEADER_REQ_MB1)); 1003 1004 writel(MBOX_BIT(1), (_PRCMU_BASE + PRCM_MBOX_CPU_SET)); 1005 wait_for_completion(&mb1_transfer.work); 1006 1007 if ((mb1_transfer.ack.header != MB1H_RELEASE_USB_WAKEUP) || 1008 ((mb1_transfer.ack.ape_voltage_status & BIT(0)) != 0)) 1009 r = -EIO; 1010 1011 mutex_unlock(&mb1_transfer.lock); 1012 1013 return r; 1014} 1015 1016/** 1017 * prcmu_set_epod - set the state of a EPOD (power domain) 1018 * @epod_id: The EPOD to set 1019 * @epod_state: The new EPOD state 1020 * 1021 * This function sets the state of a EPOD (power domain). It may not be called 1022 * from interrupt context. 1023 */ 1024int prcmu_set_epod(u16 epod_id, u8 epod_state) 1025{ 1026 int r = 0; 1027 bool ram_retention = false; 1028 int i; 1029 1030 /* check argument */ 1031 BUG_ON(epod_id >= NUM_EPOD_ID); 1032 1033 /* set flag if retention is possible */ 1034 switch (epod_id) { 1035 case EPOD_ID_SVAMMDSP: 1036 case EPOD_ID_SIAMMDSP: 1037 case EPOD_ID_ESRAM12: 1038 case EPOD_ID_ESRAM34: 1039 ram_retention = true; 1040 break; 1041 } 1042 1043 /* check argument */ 1044 BUG_ON(epod_state > EPOD_STATE_ON); 1045 BUG_ON(epod_state == EPOD_STATE_RAMRET && !ram_retention); 1046 1047 /* get lock */ 1048 mutex_lock(&mb2_transfer.lock); 1049 1050 /* wait for mailbox */ 1051 while (readl(_PRCMU_BASE + PRCM_MBOX_CPU_VAL) & MBOX_BIT(2)) 1052 cpu_relax(); 1053 1054 /* fill in mailbox */ 1055 for (i = 0; i < NUM_EPOD_ID; i++) 1056 writeb(EPOD_STATE_NO_CHANGE, (tcdm_base + PRCM_REQ_MB2 + i)); 1057 writeb(epod_state, (tcdm_base + PRCM_REQ_MB2 + epod_id)); 1058 1059 writeb(MB2H_DPS, (tcdm_base + PRCM_MBOX_HEADER_REQ_MB2)); 1060 1061 writel(MBOX_BIT(2), (_PRCMU_BASE + PRCM_MBOX_CPU_SET)); 1062 1063 /* 1064 * The current firmware version does not handle errors correctly, 1065 * and we cannot recover if there is an error. 1066 * This is expected to change when the firmware is updated. 1067 */ 1068 if (!wait_for_completion_timeout(&mb2_transfer.work, 1069 msecs_to_jiffies(20000))) { 1070 pr_err("prcmu: %s timed out (20 s) waiting for a reply.\n", 1071 __func__); 1072 r = -EIO; 1073 goto unlock_and_return; 1074 } 1075 1076 if (mb2_transfer.ack.status != HWACC_PWR_ST_OK) 1077 r = -EIO; 1078 1079unlock_and_return: 1080 mutex_unlock(&mb2_transfer.lock); 1081 return r; 1082} 1083 1084/** 1085 * prcmu_configure_auto_pm - Configure autonomous power management. 1086 * @sleep: Configuration for ApSleep. 1087 * @idle: Configuration for ApIdle. 1088 */ 1089void prcmu_configure_auto_pm(struct prcmu_auto_pm_config *sleep, 1090 struct prcmu_auto_pm_config *idle) 1091{ 1092 u32 sleep_cfg; 1093 u32 idle_cfg; 1094 unsigned long flags; 1095 1096 BUG_ON((sleep == NULL) || (idle == NULL)); 1097 1098 sleep_cfg = (sleep->sva_auto_pm_enable & 0xF); 1099 sleep_cfg = ((sleep_cfg << 4) | (sleep->sia_auto_pm_enable & 0xF)); 1100 sleep_cfg = ((sleep_cfg << 8) | (sleep->sva_power_on & 0xFF)); 1101 sleep_cfg = ((sleep_cfg << 8) | (sleep->sia_power_on & 0xFF)); 1102 sleep_cfg = ((sleep_cfg << 4) | (sleep->sva_policy & 0xF)); 1103 sleep_cfg = ((sleep_cfg << 4) | (sleep->sia_policy & 0xF)); 1104 1105 idle_cfg = (idle->sva_auto_pm_enable & 0xF); 1106 idle_cfg = ((idle_cfg << 4) | (idle->sia_auto_pm_enable & 0xF)); 1107 idle_cfg = ((idle_cfg << 8) | (idle->sva_power_on & 0xFF)); 1108 idle_cfg = ((idle_cfg << 8) | (idle->sia_power_on & 0xFF)); 1109 idle_cfg = ((idle_cfg << 4) | (idle->sva_policy & 0xF)); 1110 idle_cfg = ((idle_cfg << 4) | (idle->sia_policy & 0xF)); 1111 1112 spin_lock_irqsave(&mb2_transfer.auto_pm_lock, flags); 1113 1114 /* 1115 * The autonomous power management configuration is done through 1116 * fields in mailbox 2, but these fields are only used as shared 1117 * variables - i.e. there is no need to send a message. 1118 */ 1119 writel(sleep_cfg, (tcdm_base + PRCM_REQ_MB2_AUTO_PM_SLEEP)); 1120 writel(idle_cfg, (tcdm_base + PRCM_REQ_MB2_AUTO_PM_IDLE)); 1121 1122 mb2_transfer.auto_pm_enabled = 1123 ((sleep->sva_auto_pm_enable == PRCMU_AUTO_PM_ON) || 1124 (sleep->sia_auto_pm_enable == PRCMU_AUTO_PM_ON) || 1125 (idle->sva_auto_pm_enable == PRCMU_AUTO_PM_ON) || 1126 (idle->sia_auto_pm_enable == PRCMU_AUTO_PM_ON)); 1127 1128 spin_unlock_irqrestore(&mb2_transfer.auto_pm_lock, flags); 1129} 1130EXPORT_SYMBOL(prcmu_configure_auto_pm); 1131 1132bool prcmu_is_auto_pm_enabled(void) 1133{ 1134 return mb2_transfer.auto_pm_enabled; 1135} 1136 1137static int request_sysclk(bool enable) 1138{ 1139 int r; 1140 unsigned long flags; 1141 1142 r = 0; 1143 1144 mutex_lock(&mb3_transfer.sysclk_lock); 1145 1146 spin_lock_irqsave(&mb3_transfer.lock, flags); 1147 1148 while (readl(_PRCMU_BASE + PRCM_MBOX_CPU_VAL) & MBOX_BIT(3)) 1149 cpu_relax(); 1150 1151 writeb((enable ? ON : OFF), (tcdm_base + PRCM_REQ_MB3_SYSCLK_MGT)); 1152 1153 writeb(MB3H_SYSCLK, (tcdm_base + PRCM_MBOX_HEADER_REQ_MB3)); 1154 writel(MBOX_BIT(3), (_PRCMU_BASE + PRCM_MBOX_CPU_SET)); 1155 1156 spin_unlock_irqrestore(&mb3_transfer.lock, flags); 1157 1158 /* 1159 * The firmware only sends an ACK if we want to enable the 1160 * SysClk, and it succeeds. 1161 */ 1162 if (enable && !wait_for_completion_timeout(&mb3_transfer.sysclk_work, 1163 msecs_to_jiffies(20000))) { 1164 pr_err("prcmu: %s timed out (20 s) waiting for a reply.\n", 1165 __func__); 1166 r = -EIO; 1167 } 1168 1169 mutex_unlock(&mb3_transfer.sysclk_lock); 1170 1171 return r; 1172} 1173 1174static int request_timclk(bool enable) 1175{ 1176 u32 val = (PRCM_TCR_DOZE_MODE | PRCM_TCR_TENSEL_MASK); 1177 1178 if (!enable) 1179 val |= PRCM_TCR_STOP_TIMERS; 1180 writel(val, (_PRCMU_BASE + PRCM_TCR)); 1181 1182 return 0; 1183} 1184 1185static int request_reg_clock(u8 clock, bool enable) 1186{ 1187 u32 val; 1188 unsigned long flags; 1189 1190 spin_lock_irqsave(&clk_mgt_lock, flags); 1191 1192 /* Grab the HW semaphore. */ 1193 while ((readl(_PRCMU_BASE + PRCM_SEM) & PRCM_SEM_PRCM_SEM) != 0) 1194 cpu_relax(); 1195 1196 val = readl(_PRCMU_BASE + clk_mgt[clock].offset); 1197 if (enable) { 1198 val |= (PRCM_CLK_MGT_CLKEN | clk_mgt[clock].pllsw); 1199 } else { 1200 clk_mgt[clock].pllsw = (val & PRCM_CLK_MGT_CLKPLLSW_MASK); 1201 val &= ~(PRCM_CLK_MGT_CLKEN | PRCM_CLK_MGT_CLKPLLSW_MASK); 1202 } 1203 writel(val, (_PRCMU_BASE + clk_mgt[clock].offset)); 1204 1205 /* Release the HW semaphore. */ 1206 writel(0, (_PRCMU_BASE + PRCM_SEM)); 1207 1208 spin_unlock_irqrestore(&clk_mgt_lock, flags); 1209 1210 return 0; 1211} 1212 1213/** 1214 * prcmu_request_clock() - Request for a clock to be enabled or disabled. 1215 * @clock: The clock for which the request is made. 1216 * @enable: Whether the clock should be enabled (true) or disabled (false). 1217 * 1218 * This function should only be used by the clock implementation. 1219 * Do not use it from any other place! 1220 */ 1221int prcmu_request_clock(u8 clock, bool enable) 1222{ 1223 if (clock < PRCMU_NUM_REG_CLOCKS) 1224 return request_reg_clock(clock, enable); 1225 else if (clock == PRCMU_TIMCLK) 1226 return request_timclk(enable); 1227 else if (clock == PRCMU_SYSCLK) 1228 return request_sysclk(enable); 1229 else 1230 return -EINVAL; 1231} 1232 1233int prcmu_config_esram0_deep_sleep(u8 state) 1234{ 1235 if ((state > ESRAM0_DEEP_SLEEP_STATE_RET) || 1236 (state < ESRAM0_DEEP_SLEEP_STATE_OFF)) 1237 return -EINVAL; 1238 1239 mutex_lock(&mb4_transfer.lock); 1240 1241 while (readl(_PRCMU_BASE + PRCM_MBOX_CPU_VAL) & MBOX_BIT(4)) 1242 cpu_relax(); 1243 1244 writeb(MB4H_MEM_ST, (tcdm_base + PRCM_MBOX_HEADER_REQ_MB4)); 1245 writeb(((DDR_PWR_STATE_OFFHIGHLAT << 4) | DDR_PWR_STATE_ON), 1246 (tcdm_base + PRCM_REQ_MB4_DDR_ST_AP_SLEEP_IDLE)); 1247 writeb(DDR_PWR_STATE_ON, 1248 (tcdm_base + PRCM_REQ_MB4_DDR_ST_AP_DEEP_IDLE)); 1249 writeb(state, (tcdm_base + PRCM_REQ_MB4_ESRAM0_ST)); 1250 1251 writel(MBOX_BIT(4), (_PRCMU_BASE + PRCM_MBOX_CPU_SET)); 1252 wait_for_completion(&mb4_transfer.work); 1253 1254 mutex_unlock(&mb4_transfer.lock); 1255 1256 return 0; 1257} 1258 1259int prcmu_config_hotdog(u8 threshold) 1260{ 1261 mutex_lock(&mb4_transfer.lock); 1262 1263 while (readl(_PRCMU_BASE + PRCM_MBOX_CPU_VAL) & MBOX_BIT(4)) 1264 cpu_relax(); 1265 1266 writeb(threshold, (tcdm_base + PRCM_REQ_MB4_HOTDOG_THRESHOLD)); 1267 writeb(MB4H_HOTDOG, (tcdm_base + PRCM_MBOX_HEADER_REQ_MB4)); 1268 1269 writel(MBOX_BIT(4), (_PRCMU_BASE + PRCM_MBOX_CPU_SET)); 1270 wait_for_completion(&mb4_transfer.work); 1271 1272 mutex_unlock(&mb4_transfer.lock); 1273 1274 return 0; 1275} 1276 1277int prcmu_config_hotmon(u8 low, u8 high) 1278{ 1279 mutex_lock(&mb4_transfer.lock); 1280 1281 while (readl(_PRCMU_BASE + PRCM_MBOX_CPU_VAL) & MBOX_BIT(4)) 1282 cpu_relax(); 1283 1284 writeb(low, (tcdm_base + PRCM_REQ_MB4_HOTMON_LOW)); 1285 writeb(high, (tcdm_base + PRCM_REQ_MB4_HOTMON_HIGH)); 1286 writeb((HOTMON_CONFIG_LOW | HOTMON_CONFIG_HIGH), 1287 (tcdm_base + PRCM_REQ_MB4_HOTMON_CONFIG)); 1288 writeb(MB4H_HOTMON, (tcdm_base + PRCM_MBOX_HEADER_REQ_MB4)); 1289 1290 writel(MBOX_BIT(4), (_PRCMU_BASE + PRCM_MBOX_CPU_SET)); 1291 wait_for_completion(&mb4_transfer.work); 1292 1293 mutex_unlock(&mb4_transfer.lock); 1294 1295 return 0; 1296} 1297 1298static int config_hot_period(u16 val) 1299{ 1300 mutex_lock(&mb4_transfer.lock); 1301 1302 while (readl(_PRCMU_BASE + PRCM_MBOX_CPU_VAL) & MBOX_BIT(4)) 1303 cpu_relax(); 1304 1305 writew(val, (tcdm_base + PRCM_REQ_MB4_HOT_PERIOD)); 1306 writeb(MB4H_HOT_PERIOD, (tcdm_base + PRCM_MBOX_HEADER_REQ_MB4)); 1307 1308 writel(MBOX_BIT(4), (_PRCMU_BASE + PRCM_MBOX_CPU_SET)); 1309 wait_for_completion(&mb4_transfer.work); 1310 1311 mutex_unlock(&mb4_transfer.lock); 1312 1313 return 0; 1314} 1315 1316int prcmu_start_temp_sense(u16 cycles32k) 1317{ 1318 if (cycles32k == 0xFFFF) 1319 return -EINVAL; 1320 1321 return config_hot_period(cycles32k); 1322} 1323 1324int prcmu_stop_temp_sense(void) 1325{ 1326 return config_hot_period(0xFFFF); 1327} 1328 1329/** 1330 * prcmu_set_clock_divider() - Configure the clock divider. 1331 * @clock: The clock for which the request is made. 1332 * @divider: The clock divider. (< 32) 1333 * 1334 * This function should only be used by the clock implementation. 1335 * Do not use it from any other place! 1336 */ 1337int prcmu_set_clock_divider(u8 clock, u8 divider) 1338{ 1339 u32 val; 1340 unsigned long flags; 1341 1342 if ((clock >= PRCMU_NUM_REG_CLOCKS) || (divider < 1) || (31 < divider)) 1343 return -EINVAL; 1344 1345 spin_lock_irqsave(&clk_mgt_lock, flags); 1346 1347 /* Grab the HW semaphore. */ 1348 while ((readl(_PRCMU_BASE + PRCM_SEM) & PRCM_SEM_PRCM_SEM) != 0) 1349 cpu_relax(); 1350 1351 val = readl(_PRCMU_BASE + clk_mgt[clock].offset); 1352 val &= ~(PRCM_CLK_MGT_CLKPLLDIV_MASK); 1353 val |= (u32)divider; 1354 writel(val, (_PRCMU_BASE + clk_mgt[clock].offset)); 1355 1356 /* Release the HW semaphore. */ 1357 writel(0, (_PRCMU_BASE + PRCM_SEM)); 1358 1359 spin_unlock_irqrestore(&clk_mgt_lock, flags); 1360 1361 return 0; 1362} 1363 1364/** 1365 * prcmu_abb_read() - Read register value(s) from the ABB. 1366 * @slave: The I2C slave address. 1367 * @reg: The (start) register address. 1368 * @value: The read out value(s). 1369 * @size: The number of registers to read. 1370 * 1371 * Reads register value(s) from the ABB. 1372 * @size has to be 1 for the current firmware version. 1373 */ 1374int prcmu_abb_read(u8 slave, u8 reg, u8 *value, u8 size) 1375{ 1376 int r; 1377 1378 if (size != 1) 1379 return -EINVAL; 1380 1381 mutex_lock(&mb5_transfer.lock); 1382 1383 while (readl(_PRCMU_BASE + PRCM_MBOX_CPU_VAL) & MBOX_BIT(5)) 1384 cpu_relax(); 1385 1386 writeb(PRCMU_I2C_READ(slave), (tcdm_base + PRCM_REQ_MB5_I2C_SLAVE_OP)); 1387 writeb(PRCMU_I2C_STOP_EN, (tcdm_base + PRCM_REQ_MB5_I2C_HW_BITS)); 1388 writeb(reg, (tcdm_base + PRCM_REQ_MB5_I2C_REG)); 1389 writeb(0, (tcdm_base + PRCM_REQ_MB5_I2C_VAL)); 1390 1391 writel(MBOX_BIT(5), (_PRCMU_BASE + PRCM_MBOX_CPU_SET)); 1392 1393 if (!wait_for_completion_timeout(&mb5_transfer.work, 1394 msecs_to_jiffies(20000))) { 1395 pr_err("prcmu: %s timed out (20 s) waiting for a reply.\n", 1396 __func__); 1397 r = -EIO; 1398 } else { 1399 r = ((mb5_transfer.ack.status == I2C_RD_OK) ? 0 : -EIO); 1400 } 1401 1402 if (!r) 1403 *value = mb5_transfer.ack.value; 1404 1405 mutex_unlock(&mb5_transfer.lock); 1406 1407 return r; 1408} 1409 1410/** 1411 * prcmu_abb_write() - Write register value(s) to the ABB. 1412 * @slave: The I2C slave address. 1413 * @reg: The (start) register address. 1414 * @value: The value(s) to write. 1415 * @size: The number of registers to write. 1416 * 1417 * Reads register value(s) from the ABB. 1418 * @size has to be 1 for the current firmware version. 1419 */ 1420int prcmu_abb_write(u8 slave, u8 reg, u8 *value, u8 size) 1421{ 1422 int r; 1423 1424 if (size != 1) 1425 return -EINVAL; 1426 1427 mutex_lock(&mb5_transfer.lock); 1428 1429 while (readl(_PRCMU_BASE + PRCM_MBOX_CPU_VAL) & MBOX_BIT(5)) 1430 cpu_relax(); 1431 1432 writeb(PRCMU_I2C_WRITE(slave), (tcdm_base + PRCM_REQ_MB5_I2C_SLAVE_OP)); 1433 writeb(PRCMU_I2C_STOP_EN, (tcdm_base + PRCM_REQ_MB5_I2C_HW_BITS)); 1434 writeb(reg, (tcdm_base + PRCM_REQ_MB5_I2C_REG)); 1435 writeb(*value, (tcdm_base + PRCM_REQ_MB5_I2C_VAL)); 1436 1437 writel(MBOX_BIT(5), (_PRCMU_BASE + PRCM_MBOX_CPU_SET)); 1438 1439 if (!wait_for_completion_timeout(&mb5_transfer.work, 1440 msecs_to_jiffies(20000))) { 1441 pr_err("prcmu: %s timed out (20 s) waiting for a reply.\n", 1442 __func__); 1443 r = -EIO; 1444 } else { 1445 r = ((mb5_transfer.ack.status == I2C_WR_OK) ? 0 : -EIO); 1446 } 1447 1448 mutex_unlock(&mb5_transfer.lock); 1449 1450 return r; 1451} 1452 1453/** 1454 * prcmu_ac_wake_req - should be called whenever ARM wants to wakeup Modem 1455 */ 1456void prcmu_ac_wake_req(void) 1457{ 1458 u32 val; 1459 1460 mutex_lock(&mb0_transfer.ac_wake_lock); 1461 1462 val = readl(_PRCMU_BASE + PRCM_HOSTACCESS_REQ); 1463 if (val & PRCM_HOSTACCESS_REQ_HOSTACCESS_REQ) 1464 goto unlock_and_return; 1465 1466 atomic_set(&ac_wake_req_state, 1); 1467 1468 writel((val | PRCM_HOSTACCESS_REQ_HOSTACCESS_REQ), 1469 (_PRCMU_BASE + PRCM_HOSTACCESS_REQ)); 1470 1471 if (!wait_for_completion_timeout(&mb0_transfer.ac_wake_work, 1472 msecs_to_jiffies(20000))) { 1473 pr_err("prcmu: %s timed out (20 s) waiting for a reply.\n", 1474 __func__); 1475 } 1476 1477unlock_and_return: 1478 mutex_unlock(&mb0_transfer.ac_wake_lock); 1479} 1480 1481/** 1482 * prcmu_ac_sleep_req - called when ARM no longer needs to talk to modem 1483 */ 1484void prcmu_ac_sleep_req() 1485{ 1486 u32 val; 1487 1488 mutex_lock(&mb0_transfer.ac_wake_lock); 1489 1490 val = readl(_PRCMU_BASE + PRCM_HOSTACCESS_REQ); 1491 if (!(val & PRCM_HOSTACCESS_REQ_HOSTACCESS_REQ)) 1492 goto unlock_and_return; 1493 1494 writel((val & ~PRCM_HOSTACCESS_REQ_HOSTACCESS_REQ), 1495 (_PRCMU_BASE + PRCM_HOSTACCESS_REQ)); 1496 1497 if (!wait_for_completion_timeout(&mb0_transfer.ac_wake_work, 1498 msecs_to_jiffies(20000))) { 1499 pr_err("prcmu: %s timed out (20 s) waiting for a reply.\n", 1500 __func__); 1501 } 1502 1503 atomic_set(&ac_wake_req_state, 0); 1504 1505unlock_and_return: 1506 mutex_unlock(&mb0_transfer.ac_wake_lock); 1507} 1508 1509bool prcmu_is_ac_wake_requested(void) 1510{ 1511 return (atomic_read(&ac_wake_req_state) != 0); 1512} 1513 1514/** 1515 * prcmu_system_reset - System reset 1516 * 1517 * Saves the reset reason code and then sets the APE_SOFRST register which 1518 * fires interrupt to fw 1519 */ 1520void prcmu_system_reset(u16 reset_code) 1521{ 1522 writew(reset_code, (tcdm_base + PRCM_SW_RST_REASON)); 1523 writel(1, (_PRCMU_BASE + PRCM_APE_SOFTRST)); 1524} 1525 1526/** 1527 * prcmu_reset_modem - ask the PRCMU to reset modem 1528 */ 1529void prcmu_modem_reset(void) 1530{ 1531 mutex_lock(&mb1_transfer.lock); 1532 1533 while (readl(_PRCMU_BASE + PRCM_MBOX_CPU_VAL) & MBOX_BIT(1)) 1534 cpu_relax(); 1535 1536 writeb(MB1H_RESET_MODEM, (tcdm_base + PRCM_MBOX_HEADER_REQ_MB1)); 1537 writel(MBOX_BIT(1), (_PRCMU_BASE + PRCM_MBOX_CPU_SET)); 1538 wait_for_completion(&mb1_transfer.work); 1539 1540 /* 1541 * No need to check return from PRCMU as modem should go in reset state 1542 * This state is already managed by upper layer 1543 */ 1544 1545 mutex_unlock(&mb1_transfer.lock); 1546} 1547 1548static void ack_dbb_wakeup(void) 1549{ 1550 unsigned long flags; 1551 1552 spin_lock_irqsave(&mb0_transfer.lock, flags); 1553 1554 while (readl(_PRCMU_BASE + PRCM_MBOX_CPU_VAL) & MBOX_BIT(0)) 1555 cpu_relax(); 1556 1557 writeb(MB0H_READ_WAKEUP_ACK, (tcdm_base + PRCM_MBOX_HEADER_REQ_MB0)); 1558 writel(MBOX_BIT(0), (_PRCMU_BASE + PRCM_MBOX_CPU_SET)); 1559 1560 spin_unlock_irqrestore(&mb0_transfer.lock, flags); 1561} 1562 1563static inline void print_unknown_header_warning(u8 n, u8 header) 1564{ 1565 pr_warning("prcmu: Unknown message header (%d) in mailbox %d.\n", 1566 header, n); 1567} 1568 1569static bool read_mailbox_0(void) 1570{ 1571 bool r; 1572 u32 ev; 1573 unsigned int n; 1574 u8 header; 1575 1576 header = readb(tcdm_base + PRCM_MBOX_HEADER_ACK_MB0); 1577 switch (header) { 1578 case MB0H_WAKEUP_EXE: 1579 case MB0H_WAKEUP_SLEEP: 1580 if (readb(tcdm_base + PRCM_ACK_MB0_READ_POINTER) & 1) 1581 ev = readl(tcdm_base + PRCM_ACK_MB0_WAKEUP_1_8500); 1582 else 1583 ev = readl(tcdm_base + PRCM_ACK_MB0_WAKEUP_0_8500); 1584 1585 if (ev & (WAKEUP_BIT_AC_WAKE_ACK | WAKEUP_BIT_AC_SLEEP_ACK)) 1586 complete(&mb0_transfer.ac_wake_work); 1587 if (ev & WAKEUP_BIT_SYSCLK_OK) 1588 complete(&mb3_transfer.sysclk_work); 1589 1590 ev &= mb0_transfer.req.dbb_irqs; 1591 1592 for (n = 0; n < NUM_PRCMU_WAKEUPS; n++) { 1593 if (ev & prcmu_irq_bit[n]) 1594 generic_handle_irq(IRQ_PRCMU_BASE + n); 1595 } 1596 r = true; 1597 break; 1598 default: 1599 print_unknown_header_warning(0, header); 1600 r = false; 1601 break; 1602 } 1603 writel(MBOX_BIT(0), (_PRCMU_BASE + PRCM_ARM_IT1_CLR)); 1604 return r; 1605} 1606 1607static bool read_mailbox_1(void) 1608{ 1609 mb1_transfer.ack.header = readb(tcdm_base + PRCM_MBOX_HEADER_REQ_MB1); 1610 mb1_transfer.ack.arm_opp = readb(tcdm_base + 1611 PRCM_ACK_MB1_CURRENT_ARM_OPP); 1612 mb1_transfer.ack.ape_opp = readb(tcdm_base + 1613 PRCM_ACK_MB1_CURRENT_APE_OPP); 1614 mb1_transfer.ack.ape_voltage_status = readb(tcdm_base + 1615 PRCM_ACK_MB1_APE_VOLTAGE_STATUS); 1616 writel(MBOX_BIT(1), (_PRCMU_BASE + PRCM_ARM_IT1_CLR)); 1617 complete(&mb1_transfer.work); 1618 return false; 1619} 1620 1621static bool read_mailbox_2(void) 1622{ 1623 mb2_transfer.ack.status = readb(tcdm_base + PRCM_ACK_MB2_DPS_STATUS); 1624 writel(MBOX_BIT(2), (_PRCMU_BASE + PRCM_ARM_IT1_CLR)); 1625 complete(&mb2_transfer.work); 1626 return false; 1627} 1628 1629static bool read_mailbox_3(void) 1630{ 1631 writel(MBOX_BIT(3), (_PRCMU_BASE + PRCM_ARM_IT1_CLR)); 1632 return false; 1633} 1634 1635static bool read_mailbox_4(void) 1636{ 1637 u8 header; 1638 bool do_complete = true; 1639 1640 header = readb(tcdm_base + PRCM_MBOX_HEADER_REQ_MB4); 1641 switch (header) { 1642 case MB4H_MEM_ST: 1643 case MB4H_HOTDOG: 1644 case MB4H_HOTMON: 1645 case MB4H_HOT_PERIOD: 1646 break; 1647 default: 1648 print_unknown_header_warning(4, header); 1649 do_complete = false; 1650 break; 1651 } 1652 1653 writel(MBOX_BIT(4), (_PRCMU_BASE + PRCM_ARM_IT1_CLR)); 1654 1655 if (do_complete) 1656 complete(&mb4_transfer.work); 1657 1658 return false; 1659} 1660 1661static bool read_mailbox_5(void) 1662{ 1663 mb5_transfer.ack.status = readb(tcdm_base + PRCM_ACK_MB5_I2C_STATUS); 1664 mb5_transfer.ack.value = readb(tcdm_base + PRCM_ACK_MB5_I2C_VAL); 1665 writel(MBOX_BIT(5), (_PRCMU_BASE + PRCM_ARM_IT1_CLR)); 1666 complete(&mb5_transfer.work); 1667 return false; 1668} 1669 1670static bool read_mailbox_6(void) 1671{ 1672 writel(MBOX_BIT(6), (_PRCMU_BASE + PRCM_ARM_IT1_CLR)); 1673 return false; 1674} 1675 1676static bool read_mailbox_7(void) 1677{ 1678 writel(MBOX_BIT(7), (_PRCMU_BASE + PRCM_ARM_IT1_CLR)); 1679 return false; 1680} 1681 1682static bool (* const read_mailbox[NUM_MB])(void) = { 1683 read_mailbox_0, 1684 read_mailbox_1, 1685 read_mailbox_2, 1686 read_mailbox_3, 1687 read_mailbox_4, 1688 read_mailbox_5, 1689 read_mailbox_6, 1690 read_mailbox_7 1691}; 1692 1693static irqreturn_t prcmu_irq_handler(int irq, void *data) 1694{ 1695 u32 bits; 1696 u8 n; 1697 irqreturn_t r; 1698 1699 bits = (readl(_PRCMU_BASE + PRCM_ARM_IT1_VAL) & ALL_MBOX_BITS); 1700 if (unlikely(!bits)) 1701 return IRQ_NONE; 1702 1703 r = IRQ_HANDLED; 1704 for (n = 0; bits; n++) { 1705 if (bits & MBOX_BIT(n)) { 1706 bits -= MBOX_BIT(n); 1707 if (read_mailbox[n]()) 1708 r = IRQ_WAKE_THREAD; 1709 } 1710 } 1711 return r; 1712} 1713 1714static irqreturn_t prcmu_irq_thread_fn(int irq, void *data) 1715{ 1716 ack_dbb_wakeup(); 1717 return IRQ_HANDLED; 1718} 1719 1720static void prcmu_mask_work(struct work_struct *work) 1721{ 1722 unsigned long flags; 1723 1724 spin_lock_irqsave(&mb0_transfer.lock, flags); 1725 1726 config_wakeups(); 1727 1728 spin_unlock_irqrestore(&mb0_transfer.lock, flags); 1729} 1730 1731static void prcmu_irq_mask(struct irq_data *d) 1732{ 1733 unsigned long flags; 1734 1735 spin_lock_irqsave(&mb0_transfer.dbb_irqs_lock, flags); 1736 1737 mb0_transfer.req.dbb_irqs &= ~prcmu_irq_bit[d->irq - IRQ_PRCMU_BASE]; 1738 1739 spin_unlock_irqrestore(&mb0_transfer.dbb_irqs_lock, flags); 1740 1741 if (d->irq != IRQ_PRCMU_CA_SLEEP) 1742 schedule_work(&mb0_transfer.mask_work); 1743} 1744 1745static void prcmu_irq_unmask(struct irq_data *d) 1746{ 1747 unsigned long flags; 1748 1749 spin_lock_irqsave(&mb0_transfer.dbb_irqs_lock, flags); 1750 1751 mb0_transfer.req.dbb_irqs |= prcmu_irq_bit[d->irq - IRQ_PRCMU_BASE]; 1752 1753 spin_unlock_irqrestore(&mb0_transfer.dbb_irqs_lock, flags); 1754 1755 if (d->irq != IRQ_PRCMU_CA_SLEEP) 1756 schedule_work(&mb0_transfer.mask_work); 1757} 1758 1759static void noop(struct irq_data *d) 1760{ 1761} 1762 1763static struct irq_chip prcmu_irq_chip = { 1764 .name = "prcmu", 1765 .irq_disable = prcmu_irq_mask, 1766 .irq_ack = noop, 1767 .irq_mask = prcmu_irq_mask, 1768 .irq_unmask = prcmu_irq_unmask, 1769}; 1770 1771void __init prcmu_early_init(void) 1772{ 1773 unsigned int i; 1774 1775 if (cpu_is_u8500v1()) { 1776 tcdm_base = __io_address(U8500_PRCMU_TCDM_BASE_V1); 1777 } else if (cpu_is_u8500v2()) { 1778 void *tcpm_base = ioremap_nocache(U8500_PRCMU_TCPM_BASE, SZ_4K); 1779 1780 if (tcpm_base != NULL) { 1781 int version; 1782 version = readl(tcpm_base + PRCMU_FW_VERSION_OFFSET); 1783 prcmu_version.project_number = version & 0xFF; 1784 prcmu_version.api_version = (version >> 8) & 0xFF; 1785 prcmu_version.func_version = (version >> 16) & 0xFF; 1786 prcmu_version.errata = (version >> 24) & 0xFF; 1787 pr_info("PRCMU firmware version %d.%d.%d\n", 1788 (version >> 8) & 0xFF, (version >> 16) & 0xFF, 1789 (version >> 24) & 0xFF); 1790 iounmap(tcpm_base); 1791 } 1792 1793 tcdm_base = __io_address(U8500_PRCMU_TCDM_BASE); 1794 } else { 1795 pr_err("prcmu: Unsupported chip version\n"); 1796 BUG(); 1797 } 1798 1799 spin_lock_init(&mb0_transfer.lock); 1800 spin_lock_init(&mb0_transfer.dbb_irqs_lock); 1801 mutex_init(&mb0_transfer.ac_wake_lock); 1802 init_completion(&mb0_transfer.ac_wake_work); 1803 mutex_init(&mb1_transfer.lock); 1804 init_completion(&mb1_transfer.work); 1805 mutex_init(&mb2_transfer.lock); 1806 init_completion(&mb2_transfer.work); 1807 spin_lock_init(&mb2_transfer.auto_pm_lock); 1808 spin_lock_init(&mb3_transfer.lock); 1809 mutex_init(&mb3_transfer.sysclk_lock); 1810 init_completion(&mb3_transfer.sysclk_work); 1811 mutex_init(&mb4_transfer.lock); 1812 init_completion(&mb4_transfer.work); 1813 mutex_init(&mb5_transfer.lock); 1814 init_completion(&mb5_transfer.work); 1815 1816 INIT_WORK(&mb0_transfer.mask_work, prcmu_mask_work); 1817 1818 /* Initalize irqs. */ 1819 for (i = 0; i < NUM_PRCMU_WAKEUPS; i++) { 1820 unsigned int irq; 1821 1822 irq = IRQ_PRCMU_BASE + i; 1823 irq_set_chip_and_handler(irq, &prcmu_irq_chip, 1824 handle_simple_irq); 1825 set_irq_flags(irq, IRQF_VALID); 1826 } 1827} 1828 1829/* 1830 * Power domain switches (ePODs) modeled as regulators for the DB8500 SoC 1831 */ 1832static struct regulator_consumer_supply db8500_vape_consumers[] = { 1833 REGULATOR_SUPPLY("v-ape", NULL), 1834 REGULATOR_SUPPLY("v-i2c", "nmk-i2c.0"), 1835 REGULATOR_SUPPLY("v-i2c", "nmk-i2c.1"), 1836 REGULATOR_SUPPLY("v-i2c", "nmk-i2c.2"), 1837 REGULATOR_SUPPLY("v-i2c", "nmk-i2c.3"), 1838 /* "v-mmc" changed to "vcore" in the mainline kernel */ 1839 REGULATOR_SUPPLY("vcore", "sdi0"), 1840 REGULATOR_SUPPLY("vcore", "sdi1"), 1841 REGULATOR_SUPPLY("vcore", "sdi2"), 1842 REGULATOR_SUPPLY("vcore", "sdi3"), 1843 REGULATOR_SUPPLY("vcore", "sdi4"), 1844 REGULATOR_SUPPLY("v-dma", "dma40.0"), 1845 REGULATOR_SUPPLY("v-ape", "ab8500-usb.0"), 1846 /* "v-uart" changed to "vcore" in the mainline kernel */ 1847 REGULATOR_SUPPLY("vcore", "uart0"), 1848 REGULATOR_SUPPLY("vcore", "uart1"), 1849 REGULATOR_SUPPLY("vcore", "uart2"), 1850 REGULATOR_SUPPLY("v-ape", "nmk-ske-keypad.0"), 1851}; 1852 1853static struct regulator_consumer_supply db8500_vsmps2_consumers[] = { 1854 /* CG2900 and CW1200 power to off-chip peripherals */ 1855 REGULATOR_SUPPLY("gbf_1v8", "cg2900-uart.0"), 1856 REGULATOR_SUPPLY("wlan_1v8", "cw1200.0"), 1857 REGULATOR_SUPPLY("musb_1v8", "ab8500-usb.0"), 1858 /* AV8100 regulator */ 1859 REGULATOR_SUPPLY("hdmi_1v8", "0-0070"), 1860}; 1861 1862static struct regulator_consumer_supply db8500_b2r2_mcde_consumers[] = { 1863 REGULATOR_SUPPLY("vsupply", "b2r2.0"), 1864 REGULATOR_SUPPLY("vsupply", "mcde.0"), 1865}; 1866 1867static struct regulator_init_data db8500_regulators[DB8500_NUM_REGULATORS] = { 1868 [DB8500_REGULATOR_VAPE] = { 1869 .constraints = { 1870 .name = "db8500-vape", 1871 .valid_ops_mask = REGULATOR_CHANGE_STATUS, 1872 }, 1873 .consumer_supplies = db8500_vape_consumers, 1874 .num_consumer_supplies = ARRAY_SIZE(db8500_vape_consumers), 1875 }, 1876 [DB8500_REGULATOR_VARM] = { 1877 .constraints = { 1878 .name = "db8500-varm", 1879 .valid_ops_mask = REGULATOR_CHANGE_STATUS, 1880 }, 1881 }, 1882 [DB8500_REGULATOR_VMODEM] = { 1883 .constraints = { 1884 .name = "db8500-vmodem", 1885 .valid_ops_mask = REGULATOR_CHANGE_STATUS, 1886 }, 1887 }, 1888 [DB8500_REGULATOR_VPLL] = { 1889 .constraints = { 1890 .name = "db8500-vpll", 1891 .valid_ops_mask = REGULATOR_CHANGE_STATUS, 1892 }, 1893 }, 1894 [DB8500_REGULATOR_VSMPS1] = { 1895 .constraints = { 1896 .name = "db8500-vsmps1", 1897 .valid_ops_mask = REGULATOR_CHANGE_STATUS, 1898 }, 1899 }, 1900 [DB8500_REGULATOR_VSMPS2] = { 1901 .constraints = { 1902 .name = "db8500-vsmps2", 1903 .valid_ops_mask = REGULATOR_CHANGE_STATUS, 1904 }, 1905 .consumer_supplies = db8500_vsmps2_consumers, 1906 .num_consumer_supplies = ARRAY_SIZE(db8500_vsmps2_consumers), 1907 }, 1908 [DB8500_REGULATOR_VSMPS3] = { 1909 .constraints = { 1910 .name = "db8500-vsmps3", 1911 .valid_ops_mask = REGULATOR_CHANGE_STATUS, 1912 }, 1913 }, 1914 [DB8500_REGULATOR_VRF1] = { 1915 .constraints = { 1916 .name = "db8500-vrf1", 1917 .valid_ops_mask = REGULATOR_CHANGE_STATUS, 1918 }, 1919 }, 1920 [DB8500_REGULATOR_SWITCH_SVAMMDSP] = { 1921 .supply_regulator = "db8500-vape", 1922 .constraints = { 1923 .name = "db8500-sva-mmdsp", 1924 .valid_ops_mask = REGULATOR_CHANGE_STATUS, 1925 }, 1926 }, 1927 [DB8500_REGULATOR_SWITCH_SVAMMDSPRET] = { 1928 .constraints = { 1929 /* "ret" means "retention" */ 1930 .name = "db8500-sva-mmdsp-ret", 1931 .valid_ops_mask = REGULATOR_CHANGE_STATUS, 1932 }, 1933 }, 1934 [DB8500_REGULATOR_SWITCH_SVAPIPE] = { 1935 .supply_regulator = "db8500-vape", 1936 .constraints = { 1937 .name = "db8500-sva-pipe", 1938 .valid_ops_mask = REGULATOR_CHANGE_STATUS, 1939 }, 1940 }, 1941 [DB8500_REGULATOR_SWITCH_SIAMMDSP] = { 1942 .supply_regulator = "db8500-vape", 1943 .constraints = { 1944 .name = "db8500-sia-mmdsp", 1945 .valid_ops_mask = REGULATOR_CHANGE_STATUS, 1946 }, 1947 }, 1948 [DB8500_REGULATOR_SWITCH_SIAMMDSPRET] = { 1949 .constraints = { 1950 .name = "db8500-sia-mmdsp-ret", 1951 .valid_ops_mask = REGULATOR_CHANGE_STATUS, 1952 }, 1953 }, 1954 [DB8500_REGULATOR_SWITCH_SIAPIPE] = { 1955 .supply_regulator = "db8500-vape", 1956 .constraints = { 1957 .name = "db8500-sia-pipe", 1958 .valid_ops_mask = REGULATOR_CHANGE_STATUS, 1959 }, 1960 }, 1961 [DB8500_REGULATOR_SWITCH_SGA] = { 1962 .supply_regulator = "db8500-vape", 1963 .constraints = { 1964 .name = "db8500-sga", 1965 .valid_ops_mask = REGULATOR_CHANGE_STATUS, 1966 }, 1967 }, 1968 [DB8500_REGULATOR_SWITCH_B2R2_MCDE] = { 1969 .supply_regulator = "db8500-vape", 1970 .constraints = { 1971 .name = "db8500-b2r2-mcde", 1972 .valid_ops_mask = REGULATOR_CHANGE_STATUS, 1973 }, 1974 .consumer_supplies = db8500_b2r2_mcde_consumers, 1975 .num_consumer_supplies = ARRAY_SIZE(db8500_b2r2_mcde_consumers), 1976 }, 1977 [DB8500_REGULATOR_SWITCH_ESRAM12] = { 1978 .supply_regulator = "db8500-vape", 1979 .constraints = { 1980 .name = "db8500-esram12", 1981 .valid_ops_mask = REGULATOR_CHANGE_STATUS, 1982 }, 1983 }, 1984 [DB8500_REGULATOR_SWITCH_ESRAM12RET] = { 1985 .constraints = { 1986 .name = "db8500-esram12-ret", 1987 .valid_ops_mask = REGULATOR_CHANGE_STATUS, 1988 }, 1989 }, 1990 [DB8500_REGULATOR_SWITCH_ESRAM34] = { 1991 .supply_regulator = "db8500-vape", 1992 .constraints = { 1993 .name = "db8500-esram34", 1994 .valid_ops_mask = REGULATOR_CHANGE_STATUS, 1995 }, 1996 }, 1997 [DB8500_REGULATOR_SWITCH_ESRAM34RET] = { 1998 .constraints = { 1999 .name = "db8500-esram34-ret", 2000 .valid_ops_mask = REGULATOR_CHANGE_STATUS, 2001 }, 2002 }, 2003}; 2004 2005static struct mfd_cell db8500_prcmu_devs[] = { 2006 { 2007 .name = "db8500-prcmu-regulators", 2008 .platform_data = &db8500_regulators, 2009 .pdata_size = sizeof(db8500_regulators), 2010 }, 2011 { 2012 .name = "cpufreq-u8500", 2013 }, 2014}; 2015 2016/** 2017 * prcmu_fw_init - arch init call for the Linux PRCMU fw init logic 2018 * 2019 */ 2020static int __init db8500_prcmu_probe(struct platform_device *pdev) 2021{ 2022 int err = 0; 2023 2024 if (ux500_is_svp()) 2025 return -ENODEV; 2026 2027 /* Clean up the mailbox interrupts after pre-kernel code. */ 2028 writel(ALL_MBOX_BITS, (_PRCMU_BASE + PRCM_ARM_IT1_CLR)); 2029 2030 err = request_threaded_irq(IRQ_DB8500_PRCMU1, prcmu_irq_handler, 2031 prcmu_irq_thread_fn, IRQF_NO_SUSPEND, "prcmu", NULL); 2032 if (err < 0) { 2033 pr_err("prcmu: Failed to allocate IRQ_DB8500_PRCMU1.\n"); 2034 err = -EBUSY; 2035 goto no_irq_return; 2036 } 2037 2038 if (cpu_is_u8500v20_or_later()) 2039 prcmu_config_esram0_deep_sleep(ESRAM0_DEEP_SLEEP_STATE_RET); 2040 2041 err = mfd_add_devices(&pdev->dev, 0, db8500_prcmu_devs, 2042 ARRAY_SIZE(db8500_prcmu_devs), NULL, 2043 0); 2044 2045 if (err) 2046 pr_err("prcmu: Failed to add subdevices\n"); 2047 else 2048 pr_info("DB8500 PRCMU initialized\n"); 2049 2050no_irq_return: 2051 return err; 2052} 2053 2054static struct platform_driver db8500_prcmu_driver = { 2055 .driver = { 2056 .name = "db8500-prcmu", 2057 .owner = THIS_MODULE, 2058 }, 2059}; 2060 2061static int __init db8500_prcmu_init(void) 2062{ 2063 return platform_driver_probe(&db8500_prcmu_driver, db8500_prcmu_probe); 2064} 2065 2066arch_initcall(db8500_prcmu_init); 2067 2068MODULE_AUTHOR("Mattias Nilsson <mattias.i.nilsson@stericsson.com>"); 2069MODULE_DESCRIPTION("DB8500 PRCM Unit driver"); 2070MODULE_LICENSE("GPL v2");