Linux Audio

Check our new training course

Loading...
   1/*
   2 * Universal Flash Storage Host controller driver
   3 *
   4 * This code is based on drivers/scsi/ufs/ufshcd.h
   5 * Copyright (C) 2011-2013 Samsung India Software Operations
   6 * Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
   7 *
   8 * Authors:
   9 *	Santosh Yaraganavi <santosh.sy@samsung.com>
  10 *	Vinayak Holikatti <h.vinayak@samsung.com>
  11 *
  12 * This program is free software; you can redistribute it and/or
  13 * modify it under the terms of the GNU General Public License
  14 * as published by the Free Software Foundation; either version 2
  15 * of the License, or (at your option) any later version.
  16 * See the COPYING file in the top-level directory or visit
  17 * <http://www.gnu.org/licenses/gpl-2.0.html>
  18 *
  19 * This program is distributed in the hope that it will be useful,
  20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
  21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  22 * GNU General Public License for more details.
  23 *
  24 * This program is provided "AS IS" and "WITH ALL FAULTS" and
  25 * without warranty of any kind. You are solely responsible for
  26 * determining the appropriateness of using and distributing
  27 * the program and assume all risks associated with your exercise
  28 * of rights with respect to the program, including but not limited
  29 * to infringement of third party rights, the risks and costs of
  30 * program errors, damage to or loss of data, programs or equipment,
  31 * and unavailability or interruption of operations. Under no
  32 * circumstances will the contributor of this Program be liable for
  33 * any damages of any kind arising from your use or distribution of
  34 * this program.
  35 */
  36
  37#ifndef _UFSHCD_H
  38#define _UFSHCD_H
  39
  40#include <linux/module.h>
  41#include <linux/kernel.h>
  42#include <linux/init.h>
  43#include <linux/interrupt.h>
  44#include <linux/io.h>
  45#include <linux/delay.h>
  46#include <linux/slab.h>
  47#include <linux/spinlock.h>
  48#include <linux/rwsem.h>
  49#include <linux/workqueue.h>
  50#include <linux/errno.h>
  51#include <linux/types.h>
  52#include <linux/wait.h>
  53#include <linux/bitops.h>
  54#include <linux/pm_runtime.h>
  55#include <linux/clk.h>
  56#include <linux/completion.h>
  57#include <linux/regulator/consumer.h>
  58#include "unipro.h"
  59
  60#include <asm/irq.h>
  61#include <asm/byteorder.h>
  62#include <scsi/scsi.h>
  63#include <scsi/scsi_cmnd.h>
  64#include <scsi/scsi_host.h>
  65#include <scsi/scsi_tcq.h>
  66#include <scsi/scsi_dbg.h>
  67#include <scsi/scsi_eh.h>
  68
  69#include "ufs.h"
  70#include "ufshci.h"
  71
  72#define UFSHCD "ufshcd"
  73#define UFSHCD_DRIVER_VERSION "0.2"
  74
  75struct ufs_hba;
  76
  77enum dev_cmd_type {
  78	DEV_CMD_TYPE_NOP		= 0x0,
  79	DEV_CMD_TYPE_QUERY		= 0x1,
  80};
  81
  82/**
  83 * struct uic_command - UIC command structure
  84 * @command: UIC command
  85 * @argument1: UIC command argument 1
  86 * @argument2: UIC command argument 2
  87 * @argument3: UIC command argument 3
  88 * @cmd_active: Indicate if UIC command is outstanding
  89 * @result: UIC command result
  90 * @done: UIC command completion
  91 */
  92struct uic_command {
  93	u32 command;
  94	u32 argument1;
  95	u32 argument2;
  96	u32 argument3;
  97	int cmd_active;
  98	int result;
  99	struct completion done;
 100};
 101
 102/* Used to differentiate the power management options */
 103enum ufs_pm_op {
 104	UFS_RUNTIME_PM,
 105	UFS_SYSTEM_PM,
 106	UFS_SHUTDOWN_PM,
 107};
 108
 109#define ufshcd_is_runtime_pm(op) ((op) == UFS_RUNTIME_PM)
 110#define ufshcd_is_system_pm(op) ((op) == UFS_SYSTEM_PM)
 111#define ufshcd_is_shutdown_pm(op) ((op) == UFS_SHUTDOWN_PM)
 112
 113/* Host <-> Device UniPro Link state */
 114enum uic_link_state {
 115	UIC_LINK_OFF_STATE	= 0, /* Link powered down or disabled */
 116	UIC_LINK_ACTIVE_STATE	= 1, /* Link is in Fast/Slow/Sleep state */
 117	UIC_LINK_HIBERN8_STATE	= 2, /* Link is in Hibernate state */
 118};
 119
 120#define ufshcd_is_link_off(hba) ((hba)->uic_link_state == UIC_LINK_OFF_STATE)
 121#define ufshcd_is_link_active(hba) ((hba)->uic_link_state == \
 122				    UIC_LINK_ACTIVE_STATE)
 123#define ufshcd_is_link_hibern8(hba) ((hba)->uic_link_state == \
 124				    UIC_LINK_HIBERN8_STATE)
 125#define ufshcd_set_link_off(hba) ((hba)->uic_link_state = UIC_LINK_OFF_STATE)
 126#define ufshcd_set_link_active(hba) ((hba)->uic_link_state = \
 127				    UIC_LINK_ACTIVE_STATE)
 128#define ufshcd_set_link_hibern8(hba) ((hba)->uic_link_state = \
 129				    UIC_LINK_HIBERN8_STATE)
 130
 131/*
 132 * UFS Power management levels.
 133 * Each level is in increasing order of power savings.
 134 */
 135enum ufs_pm_level {
 136	UFS_PM_LVL_0, /* UFS_ACTIVE_PWR_MODE, UIC_LINK_ACTIVE_STATE */
 137	UFS_PM_LVL_1, /* UFS_ACTIVE_PWR_MODE, UIC_LINK_HIBERN8_STATE */
 138	UFS_PM_LVL_2, /* UFS_SLEEP_PWR_MODE, UIC_LINK_ACTIVE_STATE */
 139	UFS_PM_LVL_3, /* UFS_SLEEP_PWR_MODE, UIC_LINK_HIBERN8_STATE */
 140	UFS_PM_LVL_4, /* UFS_POWERDOWN_PWR_MODE, UIC_LINK_HIBERN8_STATE */
 141	UFS_PM_LVL_5, /* UFS_POWERDOWN_PWR_MODE, UIC_LINK_OFF_STATE */
 142	UFS_PM_LVL_MAX
 143};
 144
 145struct ufs_pm_lvl_states {
 146	enum ufs_dev_pwr_mode dev_state;
 147	enum uic_link_state link_state;
 148};
 149
 150/**
 151 * struct ufshcd_lrb - local reference block
 152 * @utr_descriptor_ptr: UTRD address of the command
 153 * @ucd_req_ptr: UCD address of the command
 154 * @ucd_rsp_ptr: Response UPIU address for this command
 155 * @ucd_prdt_ptr: PRDT address of the command
 156 * @utrd_dma_addr: UTRD dma address for debug
 157 * @ucd_prdt_dma_addr: PRDT dma address for debug
 158 * @ucd_rsp_dma_addr: UPIU response dma address for debug
 159 * @ucd_req_dma_addr: UPIU request dma address for debug
 160 * @cmd: pointer to SCSI command
 161 * @sense_buffer: pointer to sense buffer address of the SCSI command
 162 * @sense_bufflen: Length of the sense buffer
 163 * @scsi_status: SCSI status of the command
 164 * @command_type: SCSI, UFS, Query.
 165 * @task_tag: Task tag of the command
 166 * @lun: LUN of the command
 167 * @intr_cmd: Interrupt command (doesn't participate in interrupt aggregation)
 168 * @issue_time_stamp: time stamp for debug purposes
 169 * @compl_time_stamp: time stamp for statistics
 170 * @req_abort_skip: skip request abort task flag
 171 */
 172struct ufshcd_lrb {
 173	struct utp_transfer_req_desc *utr_descriptor_ptr;
 174	struct utp_upiu_req *ucd_req_ptr;
 175	struct utp_upiu_rsp *ucd_rsp_ptr;
 176	struct ufshcd_sg_entry *ucd_prdt_ptr;
 177
 178	dma_addr_t utrd_dma_addr;
 179	dma_addr_t ucd_req_dma_addr;
 180	dma_addr_t ucd_rsp_dma_addr;
 181	dma_addr_t ucd_prdt_dma_addr;
 182
 183	struct scsi_cmnd *cmd;
 184	u8 *sense_buffer;
 185	unsigned int sense_bufflen;
 186	int scsi_status;
 187
 188	int command_type;
 189	int task_tag;
 190	u8 lun; /* UPIU LUN id field is only 8-bit wide */
 191	bool intr_cmd;
 192	ktime_t issue_time_stamp;
 193	ktime_t compl_time_stamp;
 194
 195	bool req_abort_skip;
 196};
 197
 198/**
 199 * struct ufs_query - holds relevant data structures for query request
 200 * @request: request upiu and function
 201 * @descriptor: buffer for sending/receiving descriptor
 202 * @response: response upiu and response
 203 */
 204struct ufs_query {
 205	struct ufs_query_req request;
 206	u8 *descriptor;
 207	struct ufs_query_res response;
 208};
 209
 210/**
 211 * struct ufs_dev_cmd - all assosiated fields with device management commands
 212 * @type: device management command type - Query, NOP OUT
 213 * @lock: lock to allow one command at a time
 214 * @complete: internal commands completion
 215 * @tag_wq: wait queue until free command slot is available
 216 */
 217struct ufs_dev_cmd {
 218	enum dev_cmd_type type;
 219	struct mutex lock;
 220	struct completion *complete;
 221	wait_queue_head_t tag_wq;
 222	struct ufs_query query;
 223};
 224
 225struct ufs_desc_size {
 226	int dev_desc;
 227	int pwr_desc;
 228	int geom_desc;
 229	int interc_desc;
 230	int unit_desc;
 231	int conf_desc;
 232	int hlth_desc;
 233};
 234
 235/**
 236 * struct ufs_clk_info - UFS clock related info
 237 * @list: list headed by hba->clk_list_head
 238 * @clk: clock node
 239 * @name: clock name
 240 * @max_freq: maximum frequency supported by the clock
 241 * @min_freq: min frequency that can be used for clock scaling
 242 * @curr_freq: indicates the current frequency that it is set to
 243 * @enabled: variable to check against multiple enable/disable
 244 */
 245struct ufs_clk_info {
 246	struct list_head list;
 247	struct clk *clk;
 248	const char *name;
 249	u32 max_freq;
 250	u32 min_freq;
 251	u32 curr_freq;
 252	bool enabled;
 253};
 254
 255enum ufs_notify_change_status {
 256	PRE_CHANGE,
 257	POST_CHANGE,
 258};
 259
 260struct ufs_pa_layer_attr {
 261	u32 gear_rx;
 262	u32 gear_tx;
 263	u32 lane_rx;
 264	u32 lane_tx;
 265	u32 pwr_rx;
 266	u32 pwr_tx;
 267	u32 hs_rate;
 268};
 269
 270struct ufs_pwr_mode_info {
 271	bool is_valid;
 272	struct ufs_pa_layer_attr info;
 273};
 274
 275/**
 276 * struct ufs_hba_variant_ops - variant specific callbacks
 277 * @name: variant name
 278 * @init: called when the driver is initialized
 279 * @exit: called to cleanup everything done in init
 280 * @get_ufs_hci_version: called to get UFS HCI version
 281 * @clk_scale_notify: notifies that clks are scaled up/down
 282 * @setup_clocks: called before touching any of the controller registers
 283 * @setup_regulators: called before accessing the host controller
 284 * @hce_enable_notify: called before and after HCE enable bit is set to allow
 285 *                     variant specific Uni-Pro initialization.
 286 * @link_startup_notify: called before and after Link startup is carried out
 287 *                       to allow variant specific Uni-Pro initialization.
 288 * @pwr_change_notify: called before and after a power mode change
 289 *			is carried out to allow vendor spesific capabilities
 290 *			to be set.
 291 * @setup_xfer_req: called before any transfer request is issued
 292 *                  to set some things
 293 * @setup_task_mgmt: called before any task management request is issued
 294 *                  to set some things
 295 * @hibern8_notify: called around hibern8 enter/exit
 296 * @apply_dev_quirks: called to apply device specific quirks
 297 * @suspend: called during host controller PM callback
 298 * @resume: called during host controller PM callback
 299 * @dbg_register_dump: used to dump controller debug information
 300 * @phy_initialization: used to initialize phys
 301 */
 302struct ufs_hba_variant_ops {
 303	const char *name;
 304	int	(*init)(struct ufs_hba *);
 305	void    (*exit)(struct ufs_hba *);
 306	u32	(*get_ufs_hci_version)(struct ufs_hba *);
 307	int	(*clk_scale_notify)(struct ufs_hba *, bool,
 308				    enum ufs_notify_change_status);
 309	int	(*setup_clocks)(struct ufs_hba *, bool,
 310				enum ufs_notify_change_status);
 311	int     (*setup_regulators)(struct ufs_hba *, bool);
 312	int	(*hce_enable_notify)(struct ufs_hba *,
 313				     enum ufs_notify_change_status);
 314	int	(*link_startup_notify)(struct ufs_hba *,
 315				       enum ufs_notify_change_status);
 316	int	(*pwr_change_notify)(struct ufs_hba *,
 317					enum ufs_notify_change_status status,
 318					struct ufs_pa_layer_attr *,
 319					struct ufs_pa_layer_attr *);
 320	void	(*setup_xfer_req)(struct ufs_hba *, int, bool);
 321	void	(*setup_task_mgmt)(struct ufs_hba *, int, u8);
 322	void    (*hibern8_notify)(struct ufs_hba *, enum uic_cmd_dme,
 323					enum ufs_notify_change_status);
 324	int	(*apply_dev_quirks)(struct ufs_hba *);
 325	int     (*suspend)(struct ufs_hba *, enum ufs_pm_op);
 326	int     (*resume)(struct ufs_hba *, enum ufs_pm_op);
 327	void	(*dbg_register_dump)(struct ufs_hba *hba);
 328	int	(*phy_initialization)(struct ufs_hba *);
 329};
 330
 331/* clock gating state  */
 332enum clk_gating_state {
 333	CLKS_OFF,
 334	CLKS_ON,
 335	REQ_CLKS_OFF,
 336	REQ_CLKS_ON,
 337};
 338
 339/**
 340 * struct ufs_clk_gating - UFS clock gating related info
 341 * @gate_work: worker to turn off clocks after some delay as specified in
 342 * delay_ms
 343 * @ungate_work: worker to turn on clocks that will be used in case of
 344 * interrupt context
 345 * @state: the current clocks state
 346 * @delay_ms: gating delay in ms
 347 * @is_suspended: clk gating is suspended when set to 1 which can be used
 348 * during suspend/resume
 349 * @delay_attr: sysfs attribute to control delay_attr
 350 * @enable_attr: sysfs attribute to enable/disable clock gating
 351 * @is_enabled: Indicates the current status of clock gating
 352 * @active_reqs: number of requests that are pending and should be waited for
 353 * completion before gating clocks.
 354 */
 355struct ufs_clk_gating {
 356	struct delayed_work gate_work;
 357	struct work_struct ungate_work;
 358	enum clk_gating_state state;
 359	unsigned long delay_ms;
 360	bool is_suspended;
 361	struct device_attribute delay_attr;
 362	struct device_attribute enable_attr;
 363	bool is_enabled;
 364	int active_reqs;
 365};
 366
 367struct ufs_saved_pwr_info {
 368	struct ufs_pa_layer_attr info;
 369	bool is_valid;
 370};
 371
 372/**
 373 * struct ufs_clk_scaling - UFS clock scaling related data
 374 * @active_reqs: number of requests that are pending. If this is zero when
 375 * devfreq ->target() function is called then schedule "suspend_work" to
 376 * suspend devfreq.
 377 * @tot_busy_t: Total busy time in current polling window
 378 * @window_start_t: Start time (in jiffies) of the current polling window
 379 * @busy_start_t: Start time of current busy period
 380 * @enable_attr: sysfs attribute to enable/disable clock scaling
 381 * @saved_pwr_info: UFS power mode may also be changed during scaling and this
 382 * one keeps track of previous power mode.
 383 * @workq: workqueue to schedule devfreq suspend/resume work
 384 * @suspend_work: worker to suspend devfreq
 385 * @resume_work: worker to resume devfreq
 386 * @is_allowed: tracks if scaling is currently allowed or not
 387 * @is_busy_started: tracks if busy period has started or not
 388 * @is_suspended: tracks if devfreq is suspended or not
 389 */
 390struct ufs_clk_scaling {
 391	int active_reqs;
 392	unsigned long tot_busy_t;
 393	unsigned long window_start_t;
 394	ktime_t busy_start_t;
 395	struct device_attribute enable_attr;
 396	struct ufs_saved_pwr_info saved_pwr_info;
 397	struct workqueue_struct *workq;
 398	struct work_struct suspend_work;
 399	struct work_struct resume_work;
 400	bool is_allowed;
 401	bool is_busy_started;
 402	bool is_suspended;
 
 403};
 404
 405/**
 406 * struct ufs_init_prefetch - contains data that is pre-fetched once during
 407 * initialization
 408 * @icc_level: icc level which was read during initialization
 409 */
 410struct ufs_init_prefetch {
 411	u32 icc_level;
 412};
 413
 414#define UIC_ERR_REG_HIST_LENGTH 8
 415/**
 416 * struct ufs_uic_err_reg_hist - keeps history of uic errors
 417 * @pos: index to indicate cyclic buffer position
 418 * @reg: cyclic buffer for registers value
 419 * @tstamp: cyclic buffer for time stamp
 420 */
 421struct ufs_uic_err_reg_hist {
 422	int pos;
 423	u32 reg[UIC_ERR_REG_HIST_LENGTH];
 424	ktime_t tstamp[UIC_ERR_REG_HIST_LENGTH];
 425};
 426
 427/**
 428 * struct ufs_stats - keeps usage/err statistics
 429 * @hibern8_exit_cnt: Counter to keep track of number of exits,
 430 *		reset this after link-startup.
 431 * @last_hibern8_exit_tstamp: Set time after the hibern8 exit.
 432 *		Clear after the first successful command completion.
 433 * @pa_err: tracks pa-uic errors
 434 * @dl_err: tracks dl-uic errors
 435 * @nl_err: tracks nl-uic errors
 436 * @tl_err: tracks tl-uic errors
 437 * @dme_err: tracks dme errors
 438 */
 439struct ufs_stats {
 440	u32 hibern8_exit_cnt;
 441	ktime_t last_hibern8_exit_tstamp;
 442	struct ufs_uic_err_reg_hist pa_err;
 443	struct ufs_uic_err_reg_hist dl_err;
 444	struct ufs_uic_err_reg_hist nl_err;
 445	struct ufs_uic_err_reg_hist tl_err;
 446	struct ufs_uic_err_reg_hist dme_err;
 447};
 448
 449/**
 450 * struct ufs_hba - per adapter private structure
 451 * @mmio_base: UFSHCI base register address
 452 * @ucdl_base_addr: UFS Command Descriptor base address
 453 * @utrdl_base_addr: UTP Transfer Request Descriptor base address
 454 * @utmrdl_base_addr: UTP Task Management Descriptor base address
 455 * @ucdl_dma_addr: UFS Command Descriptor DMA address
 456 * @utrdl_dma_addr: UTRDL DMA address
 457 * @utmrdl_dma_addr: UTMRDL DMA address
 458 * @host: Scsi_Host instance of the driver
 459 * @dev: device handle
 460 * @lrb: local reference block
 461 * @lrb_in_use: lrb in use
 462 * @outstanding_tasks: Bits representing outstanding task requests
 463 * @outstanding_reqs: Bits representing outstanding transfer requests
 464 * @capabilities: UFS Controller Capabilities
 465 * @nutrs: Transfer Request Queue depth supported by controller
 466 * @nutmrs: Task Management Queue depth supported by controller
 467 * @ufs_version: UFS Version to which controller complies
 468 * @vops: pointer to variant specific operations
 469 * @priv: pointer to variant specific private data
 470 * @irq: Irq number of the controller
 471 * @active_uic_cmd: handle of active UIC command
 472 * @uic_cmd_mutex: mutex for uic command
 473 * @tm_wq: wait queue for task management
 474 * @tm_tag_wq: wait queue for free task management slots
 475 * @tm_slots_in_use: bit map of task management request slots in use
 476 * @pwr_done: completion for power mode change
 477 * @tm_condition: condition variable for task management
 478 * @ufshcd_state: UFSHCD states
 479 * @eh_flags: Error handling flags
 480 * @intr_mask: Interrupt Mask Bits
 481 * @ee_ctrl_mask: Exception event control mask
 482 * @is_powered: flag to check if HBA is powered
 483 * @is_init_prefetch: flag to check if data was pre-fetched in initialization
 484 * @init_prefetch_data: data pre-fetched during initialization
 485 * @eh_work: Worker to handle UFS errors that require s/w attention
 486 * @eeh_work: Worker to handle exception events
 487 * @errors: HBA errors
 488 * @uic_error: UFS interconnect layer error status
 489 * @saved_err: sticky error mask
 490 * @saved_uic_err: sticky UIC error mask
 491 * @dev_cmd: ufs device management command information
 492 * @last_dme_cmd_tstamp: time stamp of the last completed DME command
 493 * @auto_bkops_enabled: to track whether bkops is enabled in device
 494 * @vreg_info: UFS device voltage regulator information
 495 * @clk_list_head: UFS host controller clocks list node head
 496 * @pwr_info: holds current power mode
 497 * @max_pwr_info: keeps the device max valid pwm
 498 * @desc_size: descriptor sizes reported by device
 499 * @urgent_bkops_lvl: keeps track of urgent bkops level for device
 500 * @is_urgent_bkops_lvl_checked: keeps track if the urgent bkops level for
 501 *  device is known or not.
 502 */
 503struct ufs_hba {
 504	void __iomem *mmio_base;
 505
 506	/* Virtual memory reference */
 507	struct utp_transfer_cmd_desc *ucdl_base_addr;
 508	struct utp_transfer_req_desc *utrdl_base_addr;
 509	struct utp_task_req_desc *utmrdl_base_addr;
 510
 511	/* DMA memory reference */
 512	dma_addr_t ucdl_dma_addr;
 513	dma_addr_t utrdl_dma_addr;
 514	dma_addr_t utmrdl_dma_addr;
 515
 516	struct Scsi_Host *host;
 517	struct device *dev;
 518	/*
 519	 * This field is to keep a reference to "scsi_device" corresponding to
 520	 * "UFS device" W-LU.
 521	 */
 522	struct scsi_device *sdev_ufs_device;
 523
 524	enum ufs_dev_pwr_mode curr_dev_pwr_mode;
 525	enum uic_link_state uic_link_state;
 526	/* Desired UFS power management level during runtime PM */
 527	enum ufs_pm_level rpm_lvl;
 528	/* Desired UFS power management level during system PM */
 529	enum ufs_pm_level spm_lvl;
 530	struct device_attribute rpm_lvl_attr;
 531	struct device_attribute spm_lvl_attr;
 532	int pm_op_in_progress;
 533
 534	/* Auto-Hibernate Idle Timer register value */
 535	u32 ahit;
 536
 537	struct ufshcd_lrb *lrb;
 538	unsigned long lrb_in_use;
 539
 540	unsigned long outstanding_tasks;
 541	unsigned long outstanding_reqs;
 542
 543	u32 capabilities;
 544	int nutrs;
 545	int nutmrs;
 546	u32 ufs_version;
 547	struct ufs_hba_variant_ops *vops;
 548	void *priv;
 549	unsigned int irq;
 550	bool is_irq_enabled;
 551
 552	/* Interrupt aggregation support is broken */
 553	#define UFSHCD_QUIRK_BROKEN_INTR_AGGR			0x1
 554
 555	/*
 556	 * delay before each dme command is required as the unipro
 557	 * layer has shown instabilities
 558	 */
 559	#define UFSHCD_QUIRK_DELAY_BEFORE_DME_CMDS		0x2
 560
 561	/*
 562	 * If UFS host controller is having issue in processing LCC (Line
 563	 * Control Command) coming from device then enable this quirk.
 564	 * When this quirk is enabled, host controller driver should disable
 565	 * the LCC transmission on UFS device (by clearing TX_LCC_ENABLE
 566	 * attribute of device to 0).
 567	 */
 568	#define UFSHCD_QUIRK_BROKEN_LCC				0x4
 569
 570	/*
 571	 * The attribute PA_RXHSUNTERMCAP specifies whether or not the
 572	 * inbound Link supports unterminated line in HS mode. Setting this
 573	 * attribute to 1 fixes moving to HS gear.
 574	 */
 575	#define UFSHCD_QUIRK_BROKEN_PA_RXHSUNTERMCAP		0x8
 576
 577	/*
 578	 * This quirk needs to be enabled if the host contoller only allows
 579	 * accessing the peer dme attributes in AUTO mode (FAST AUTO or
 580	 * SLOW AUTO).
 581	 */
 582	#define UFSHCD_QUIRK_DME_PEER_ACCESS_AUTO_MODE		0x10
 583
 584	/*
 585	 * This quirk needs to be enabled if the host contoller doesn't
 586	 * advertise the correct version in UFS_VER register. If this quirk
 587	 * is enabled, standard UFS host driver will call the vendor specific
 588	 * ops (get_ufs_hci_version) to get the correct version.
 589	 */
 590	#define UFSHCD_QUIRK_BROKEN_UFS_HCI_VERSION		0x20
 591
 592	/*
 593	 * This quirk needs to be enabled if the host contoller regards
 594	 * resolution of the values of PRDTO and PRDTL in UTRD as byte.
 595	 */
 596	#define UFSHCD_QUIRK_PRDT_BYTE_GRAN			0x80
 597
 598	unsigned int quirks;	/* Deviations from standard UFSHCI spec. */
 599
 600	/* Device deviations from standard UFS device spec. */
 601	unsigned int dev_quirks;
 602
 603	wait_queue_head_t tm_wq;
 604	wait_queue_head_t tm_tag_wq;
 605	unsigned long tm_condition;
 606	unsigned long tm_slots_in_use;
 607
 608	struct uic_command *active_uic_cmd;
 609	struct mutex uic_cmd_mutex;
 610	struct completion *uic_async_done;
 611
 612	u32 ufshcd_state;
 613	u32 eh_flags;
 614	u32 intr_mask;
 615	u16 ee_ctrl_mask;
 616	bool is_powered;
 617	bool is_init_prefetch;
 618	struct ufs_init_prefetch init_prefetch_data;
 619
 620	/* Work Queues */
 621	struct work_struct eh_work;
 622	struct work_struct eeh_work;
 623
 624	/* HBA Errors */
 625	u32 errors;
 626	u32 uic_error;
 627	u32 saved_err;
 628	u32 saved_uic_err;
 629	struct ufs_stats ufs_stats;
 630
 631	/* Device management request data */
 632	struct ufs_dev_cmd dev_cmd;
 633	ktime_t last_dme_cmd_tstamp;
 634
 635	/* Keeps information of the UFS device connected to this host */
 636	struct ufs_dev_info dev_info;
 637	bool auto_bkops_enabled;
 638	struct ufs_vreg_info vreg_info;
 639	struct list_head clk_list_head;
 640
 641	bool wlun_dev_clr_ua;
 642
 643	/* Number of requests aborts */
 644	int req_abort_count;
 645
 646	/* Number of lanes available (1 or 2) for Rx/Tx */
 647	u32 lanes_per_direction;
 648	struct ufs_pa_layer_attr pwr_info;
 649	struct ufs_pwr_mode_info max_pwr_info;
 650
 651	struct ufs_clk_gating clk_gating;
 652	/* Control to enable/disable host capabilities */
 653	u32 caps;
 654	/* Allow dynamic clk gating */
 655#define UFSHCD_CAP_CLK_GATING	(1 << 0)
 656	/* Allow hiberb8 with clk gating */
 657#define UFSHCD_CAP_HIBERN8_WITH_CLK_GATING (1 << 1)
 658	/* Allow dynamic clk scaling */
 659#define UFSHCD_CAP_CLK_SCALING	(1 << 2)
 660	/* Allow auto bkops to enabled during runtime suspend */
 661#define UFSHCD_CAP_AUTO_BKOPS_SUSPEND (1 << 3)
 662	/*
 663	 * This capability allows host controller driver to use the UFS HCI's
 664	 * interrupt aggregation capability.
 665	 * CAUTION: Enabling this might reduce overall UFS throughput.
 666	 */
 667#define UFSHCD_CAP_INTR_AGGR (1 << 4)
 668	/*
 669	 * This capability allows the device auto-bkops to be always enabled
 670	 * except during suspend (both runtime and suspend).
 671	 * Enabling this capability means that device will always be allowed
 672	 * to do background operation when it's active but it might degrade
 673	 * the performance of ongoing read/write operations.
 674	 */
 675#define UFSHCD_CAP_KEEP_AUTO_BKOPS_ENABLED_EXCEPT_SUSPEND (1 << 5)
 676
 677	struct devfreq *devfreq;
 678	struct ufs_clk_scaling clk_scaling;
 679	bool is_sys_suspended;
 680
 681	enum bkops_status urgent_bkops_lvl;
 682	bool is_urgent_bkops_lvl_checked;
 683
 684	struct rw_semaphore clk_scaling_lock;
 685	struct ufs_desc_size desc_size;
 686};
 687
 688/* Returns true if clocks can be gated. Otherwise false */
 689static inline bool ufshcd_is_clkgating_allowed(struct ufs_hba *hba)
 690{
 691	return hba->caps & UFSHCD_CAP_CLK_GATING;
 692}
 693static inline bool ufshcd_can_hibern8_during_gating(struct ufs_hba *hba)
 694{
 695	return hba->caps & UFSHCD_CAP_HIBERN8_WITH_CLK_GATING;
 696}
 697static inline int ufshcd_is_clkscaling_supported(struct ufs_hba *hba)
 698{
 699	return hba->caps & UFSHCD_CAP_CLK_SCALING;
 700}
 701static inline bool ufshcd_can_autobkops_during_suspend(struct ufs_hba *hba)
 702{
 703	return hba->caps & UFSHCD_CAP_AUTO_BKOPS_SUSPEND;
 704}
 705
 706static inline bool ufshcd_is_intr_aggr_allowed(struct ufs_hba *hba)
 707{
 708/* DWC UFS Core has the Interrupt aggregation feature but is not detectable*/
 709#ifndef CONFIG_SCSI_UFS_DWC
 710	if ((hba->caps & UFSHCD_CAP_INTR_AGGR) &&
 711	    !(hba->quirks & UFSHCD_QUIRK_BROKEN_INTR_AGGR))
 712		return true;
 713	else
 714		return false;
 715#else
 716return true;
 717#endif
 718}
 719
 720#define ufshcd_writel(hba, val, reg)	\
 721	writel((val), (hba)->mmio_base + (reg))
 722#define ufshcd_readl(hba, reg)	\
 723	readl((hba)->mmio_base + (reg))
 724
 725/**
 726 * ufshcd_rmwl - read modify write into a register
 727 * @hba - per adapter instance
 728 * @mask - mask to apply on read value
 729 * @val - actual value to write
 730 * @reg - register address
 731 */
 732static inline void ufshcd_rmwl(struct ufs_hba *hba, u32 mask, u32 val, u32 reg)
 733{
 734	u32 tmp;
 735
 736	tmp = ufshcd_readl(hba, reg);
 737	tmp &= ~mask;
 738	tmp |= (val & mask);
 739	ufshcd_writel(hba, tmp, reg);
 740}
 741
 742int ufshcd_alloc_host(struct device *, struct ufs_hba **);
 743void ufshcd_dealloc_host(struct ufs_hba *);
 744int ufshcd_init(struct ufs_hba * , void __iomem * , unsigned int);
 745void ufshcd_remove(struct ufs_hba *);
 746int ufshcd_wait_for_register(struct ufs_hba *hba, u32 reg, u32 mask,
 747				u32 val, unsigned long interval_us,
 748				unsigned long timeout_ms, bool can_sleep);
 749
 750static inline void check_upiu_size(void)
 751{
 752	BUILD_BUG_ON(ALIGNED_UPIU_SIZE <
 753		GENERAL_UPIU_REQUEST_SIZE + QUERY_DESC_MAX_SIZE);
 754}
 755
 756/**
 757 * ufshcd_set_variant - set variant specific data to the hba
 758 * @hba - per adapter instance
 759 * @variant - pointer to variant specific data
 760 */
 761static inline void ufshcd_set_variant(struct ufs_hba *hba, void *variant)
 762{
 763	BUG_ON(!hba);
 764	hba->priv = variant;
 765}
 766
 767/**
 768 * ufshcd_get_variant - get variant specific data from the hba
 769 * @hba - per adapter instance
 770 */
 771static inline void *ufshcd_get_variant(struct ufs_hba *hba)
 772{
 773	BUG_ON(!hba);
 774	return hba->priv;
 775}
 776static inline bool ufshcd_keep_autobkops_enabled_except_suspend(
 777							struct ufs_hba *hba)
 778{
 779	return hba->caps & UFSHCD_CAP_KEEP_AUTO_BKOPS_ENABLED_EXCEPT_SUSPEND;
 780}
 781
 782extern int ufshcd_runtime_suspend(struct ufs_hba *hba);
 783extern int ufshcd_runtime_resume(struct ufs_hba *hba);
 784extern int ufshcd_runtime_idle(struct ufs_hba *hba);
 785extern int ufshcd_system_suspend(struct ufs_hba *hba);
 786extern int ufshcd_system_resume(struct ufs_hba *hba);
 787extern int ufshcd_shutdown(struct ufs_hba *hba);
 788extern int ufshcd_dme_set_attr(struct ufs_hba *hba, u32 attr_sel,
 789			       u8 attr_set, u32 mib_val, u8 peer);
 790extern int ufshcd_dme_get_attr(struct ufs_hba *hba, u32 attr_sel,
 791			       u32 *mib_val, u8 peer);
 792
 793/* UIC command interfaces for DME primitives */
 794#define DME_LOCAL	0
 795#define DME_PEER	1
 796#define ATTR_SET_NOR	0	/* NORMAL */
 797#define ATTR_SET_ST	1	/* STATIC */
 798
 799static inline int ufshcd_dme_set(struct ufs_hba *hba, u32 attr_sel,
 800				 u32 mib_val)
 801{
 802	return ufshcd_dme_set_attr(hba, attr_sel, ATTR_SET_NOR,
 803				   mib_val, DME_LOCAL);
 804}
 805
 806static inline int ufshcd_dme_st_set(struct ufs_hba *hba, u32 attr_sel,
 807				    u32 mib_val)
 808{
 809	return ufshcd_dme_set_attr(hba, attr_sel, ATTR_SET_ST,
 810				   mib_val, DME_LOCAL);
 811}
 812
 813static inline int ufshcd_dme_peer_set(struct ufs_hba *hba, u32 attr_sel,
 814				      u32 mib_val)
 815{
 816	return ufshcd_dme_set_attr(hba, attr_sel, ATTR_SET_NOR,
 817				   mib_val, DME_PEER);
 818}
 819
 820static inline int ufshcd_dme_peer_st_set(struct ufs_hba *hba, u32 attr_sel,
 821					 u32 mib_val)
 822{
 823	return ufshcd_dme_set_attr(hba, attr_sel, ATTR_SET_ST,
 824				   mib_val, DME_PEER);
 825}
 826
 827static inline int ufshcd_dme_get(struct ufs_hba *hba,
 828				 u32 attr_sel, u32 *mib_val)
 829{
 830	return ufshcd_dme_get_attr(hba, attr_sel, mib_val, DME_LOCAL);
 831}
 832
 833static inline int ufshcd_dme_peer_get(struct ufs_hba *hba,
 834				      u32 attr_sel, u32 *mib_val)
 835{
 836	return ufshcd_dme_get_attr(hba, attr_sel, mib_val, DME_PEER);
 837}
 838
 
 
 839static inline bool ufshcd_is_hs_mode(struct ufs_pa_layer_attr *pwr_info)
 840{
 841	return (pwr_info->pwr_rx == FAST_MODE ||
 842		pwr_info->pwr_rx == FASTAUTO_MODE) &&
 843		(pwr_info->pwr_tx == FAST_MODE ||
 844		pwr_info->pwr_tx == FASTAUTO_MODE);
 845}
 846
 
 
 
 
 
 847/* Expose Query-Request API */
 848int ufshcd_query_descriptor_retry(struct ufs_hba *hba,
 849				  enum query_opcode opcode,
 850				  enum desc_idn idn, u8 index,
 851				  u8 selector,
 852				  u8 *desc_buf, int *buf_len);
 853int ufshcd_read_desc_param(struct ufs_hba *hba,
 854			   enum desc_idn desc_id,
 855			   int desc_index,
 856			   u8 param_offset,
 857			   u8 *param_read_buf,
 858			   u8 param_size);
 859int ufshcd_query_attr(struct ufs_hba *hba, enum query_opcode opcode,
 860		      enum attr_idn idn, u8 index, u8 selector, u32 *attr_val);
 861int ufshcd_query_flag(struct ufs_hba *hba, enum query_opcode opcode,
 862	enum flag_idn idn, bool *flag_res);
 863int ufshcd_read_string_desc(struct ufs_hba *hba, int desc_index,
 864			    u8 *buf, u32 size, bool ascii);
 865
 866int ufshcd_hold(struct ufs_hba *hba, bool async);
 867void ufshcd_release(struct ufs_hba *hba);
 868
 869int ufshcd_map_desc_id_to_length(struct ufs_hba *hba, enum desc_idn desc_id,
 870	int *desc_length);
 871
 872u32 ufshcd_get_local_unipro_ver(struct ufs_hba *hba);
 873
 874/* Wrapper functions for safely calling variant operations */
 875static inline const char *ufshcd_get_var_name(struct ufs_hba *hba)
 876{
 877	if (hba->vops)
 878		return hba->vops->name;
 879	return "";
 880}
 881
 882static inline int ufshcd_vops_init(struct ufs_hba *hba)
 883{
 884	if (hba->vops && hba->vops->init)
 885		return hba->vops->init(hba);
 886
 887	return 0;
 888}
 889
 890static inline void ufshcd_vops_exit(struct ufs_hba *hba)
 891{
 892	if (hba->vops && hba->vops->exit)
 893		return hba->vops->exit(hba);
 894}
 895
 896static inline u32 ufshcd_vops_get_ufs_hci_version(struct ufs_hba *hba)
 897{
 898	if (hba->vops && hba->vops->get_ufs_hci_version)
 899		return hba->vops->get_ufs_hci_version(hba);
 900
 901	return ufshcd_readl(hba, REG_UFS_VERSION);
 902}
 903
 904static inline int ufshcd_vops_clk_scale_notify(struct ufs_hba *hba,
 905			bool up, enum ufs_notify_change_status status)
 906{
 907	if (hba->vops && hba->vops->clk_scale_notify)
 908		return hba->vops->clk_scale_notify(hba, up, status);
 909	return 0;
 910}
 911
 912static inline int ufshcd_vops_setup_clocks(struct ufs_hba *hba, bool on,
 913					enum ufs_notify_change_status status)
 914{
 915	if (hba->vops && hba->vops->setup_clocks)
 916		return hba->vops->setup_clocks(hba, on, status);
 917	return 0;
 918}
 919
 920static inline int ufshcd_vops_setup_regulators(struct ufs_hba *hba, bool status)
 921{
 922	if (hba->vops && hba->vops->setup_regulators)
 923		return hba->vops->setup_regulators(hba, status);
 924
 925	return 0;
 926}
 927
 928static inline int ufshcd_vops_hce_enable_notify(struct ufs_hba *hba,
 929						bool status)
 930{
 931	if (hba->vops && hba->vops->hce_enable_notify)
 932		return hba->vops->hce_enable_notify(hba, status);
 933
 934	return 0;
 935}
 936static inline int ufshcd_vops_link_startup_notify(struct ufs_hba *hba,
 937						bool status)
 938{
 939	if (hba->vops && hba->vops->link_startup_notify)
 940		return hba->vops->link_startup_notify(hba, status);
 941
 942	return 0;
 943}
 944
 945static inline int ufshcd_vops_pwr_change_notify(struct ufs_hba *hba,
 946				  bool status,
 947				  struct ufs_pa_layer_attr *dev_max_params,
 948				  struct ufs_pa_layer_attr *dev_req_params)
 949{
 950	if (hba->vops && hba->vops->pwr_change_notify)
 951		return hba->vops->pwr_change_notify(hba, status,
 952					dev_max_params, dev_req_params);
 953
 954	return -ENOTSUPP;
 955}
 956
 957static inline void ufshcd_vops_setup_xfer_req(struct ufs_hba *hba, int tag,
 958					bool is_scsi_cmd)
 959{
 960	if (hba->vops && hba->vops->setup_xfer_req)
 961		return hba->vops->setup_xfer_req(hba, tag, is_scsi_cmd);
 962}
 963
 964static inline void ufshcd_vops_setup_task_mgmt(struct ufs_hba *hba,
 965					int tag, u8 tm_function)
 966{
 967	if (hba->vops && hba->vops->setup_task_mgmt)
 968		return hba->vops->setup_task_mgmt(hba, tag, tm_function);
 969}
 970
 971static inline void ufshcd_vops_hibern8_notify(struct ufs_hba *hba,
 972					enum uic_cmd_dme cmd,
 973					enum ufs_notify_change_status status)
 974{
 975	if (hba->vops && hba->vops->hibern8_notify)
 976		return hba->vops->hibern8_notify(hba, cmd, status);
 977}
 978
 979static inline int ufshcd_vops_apply_dev_quirks(struct ufs_hba *hba)
 980{
 981	if (hba->vops && hba->vops->apply_dev_quirks)
 982		return hba->vops->apply_dev_quirks(hba);
 983	return 0;
 984}
 985
 986static inline int ufshcd_vops_suspend(struct ufs_hba *hba, enum ufs_pm_op op)
 987{
 988	if (hba->vops && hba->vops->suspend)
 989		return hba->vops->suspend(hba, op);
 990
 991	return 0;
 992}
 993
 994static inline int ufshcd_vops_resume(struct ufs_hba *hba, enum ufs_pm_op op)
 995{
 996	if (hba->vops && hba->vops->resume)
 997		return hba->vops->resume(hba, op);
 998
 999	return 0;
1000}
1001
1002static inline void ufshcd_vops_dbg_register_dump(struct ufs_hba *hba)
1003{
1004	if (hba->vops && hba->vops->dbg_register_dump)
1005		hba->vops->dbg_register_dump(hba);
1006}
1007
1008extern struct ufs_pm_lvl_states ufs_pm_lvl_states[];
1009
1010/*
1011 * ufshcd_scsi_to_upiu_lun - maps scsi LUN to UPIU LUN
1012 * @scsi_lun: scsi LUN id
1013 *
1014 * Returns UPIU LUN id
1015 */
1016static inline u8 ufshcd_scsi_to_upiu_lun(unsigned int scsi_lun)
1017{
1018	if (scsi_is_wlun(scsi_lun))
1019		return (scsi_lun & UFS_UPIU_MAX_UNIT_NUM_ID)
1020			| UFS_UPIU_WLUN_ID;
1021	else
1022		return scsi_lun & UFS_UPIU_MAX_UNIT_NUM_ID;
1023}
1024
1025#endif /* End of Header */
  1/*
  2 * Universal Flash Storage Host controller driver
  3 *
  4 * This code is based on drivers/scsi/ufs/ufshcd.h
  5 * Copyright (C) 2011-2013 Samsung India Software Operations
  6 * Copyright (c) 2013-2016, The Linux Foundation. All rights reserved.
  7 *
  8 * Authors:
  9 *	Santosh Yaraganavi <santosh.sy@samsung.com>
 10 *	Vinayak Holikatti <h.vinayak@samsung.com>
 11 *
 12 * This program is free software; you can redistribute it and/or
 13 * modify it under the terms of the GNU General Public License
 14 * as published by the Free Software Foundation; either version 2
 15 * of the License, or (at your option) any later version.
 16 * See the COPYING file in the top-level directory or visit
 17 * <http://www.gnu.org/licenses/gpl-2.0.html>
 18 *
 19 * This program is distributed in the hope that it will be useful,
 20 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 22 * GNU General Public License for more details.
 23 *
 24 * This program is provided "AS IS" and "WITH ALL FAULTS" and
 25 * without warranty of any kind. You are solely responsible for
 26 * determining the appropriateness of using and distributing
 27 * the program and assume all risks associated with your exercise
 28 * of rights with respect to the program, including but not limited
 29 * to infringement of third party rights, the risks and costs of
 30 * program errors, damage to or loss of data, programs or equipment,
 31 * and unavailability or interruption of operations. Under no
 32 * circumstances will the contributor of this Program be liable for
 33 * any damages of any kind arising from your use or distribution of
 34 * this program.
 35 */
 36
 37#ifndef _UFSHCD_H
 38#define _UFSHCD_H
 39
 40#include <linux/module.h>
 41#include <linux/kernel.h>
 42#include <linux/init.h>
 43#include <linux/interrupt.h>
 44#include <linux/io.h>
 45#include <linux/delay.h>
 46#include <linux/slab.h>
 47#include <linux/spinlock.h>
 
 48#include <linux/workqueue.h>
 49#include <linux/errno.h>
 50#include <linux/types.h>
 51#include <linux/wait.h>
 52#include <linux/bitops.h>
 53#include <linux/pm_runtime.h>
 54#include <linux/clk.h>
 55#include <linux/completion.h>
 56#include <linux/regulator/consumer.h>
 57#include "unipro.h"
 58
 59#include <asm/irq.h>
 60#include <asm/byteorder.h>
 61#include <scsi/scsi.h>
 62#include <scsi/scsi_cmnd.h>
 63#include <scsi/scsi_host.h>
 64#include <scsi/scsi_tcq.h>
 65#include <scsi/scsi_dbg.h>
 66#include <scsi/scsi_eh.h>
 67
 68#include "ufs.h"
 69#include "ufshci.h"
 70
 71#define UFSHCD "ufshcd"
 72#define UFSHCD_DRIVER_VERSION "0.2"
 73
 74struct ufs_hba;
 75
 76enum dev_cmd_type {
 77	DEV_CMD_TYPE_NOP		= 0x0,
 78	DEV_CMD_TYPE_QUERY		= 0x1,
 79};
 80
 81/**
 82 * struct uic_command - UIC command structure
 83 * @command: UIC command
 84 * @argument1: UIC command argument 1
 85 * @argument2: UIC command argument 2
 86 * @argument3: UIC command argument 3
 87 * @cmd_active: Indicate if UIC command is outstanding
 88 * @result: UIC command result
 89 * @done: UIC command completion
 90 */
 91struct uic_command {
 92	u32 command;
 93	u32 argument1;
 94	u32 argument2;
 95	u32 argument3;
 96	int cmd_active;
 97	int result;
 98	struct completion done;
 99};
100
101/* Used to differentiate the power management options */
102enum ufs_pm_op {
103	UFS_RUNTIME_PM,
104	UFS_SYSTEM_PM,
105	UFS_SHUTDOWN_PM,
106};
107
108#define ufshcd_is_runtime_pm(op) ((op) == UFS_RUNTIME_PM)
109#define ufshcd_is_system_pm(op) ((op) == UFS_SYSTEM_PM)
110#define ufshcd_is_shutdown_pm(op) ((op) == UFS_SHUTDOWN_PM)
111
112/* Host <-> Device UniPro Link state */
113enum uic_link_state {
114	UIC_LINK_OFF_STATE	= 0, /* Link powered down or disabled */
115	UIC_LINK_ACTIVE_STATE	= 1, /* Link is in Fast/Slow/Sleep state */
116	UIC_LINK_HIBERN8_STATE	= 2, /* Link is in Hibernate state */
117};
118
119#define ufshcd_is_link_off(hba) ((hba)->uic_link_state == UIC_LINK_OFF_STATE)
120#define ufshcd_is_link_active(hba) ((hba)->uic_link_state == \
121				    UIC_LINK_ACTIVE_STATE)
122#define ufshcd_is_link_hibern8(hba) ((hba)->uic_link_state == \
123				    UIC_LINK_HIBERN8_STATE)
124#define ufshcd_set_link_off(hba) ((hba)->uic_link_state = UIC_LINK_OFF_STATE)
125#define ufshcd_set_link_active(hba) ((hba)->uic_link_state = \
126				    UIC_LINK_ACTIVE_STATE)
127#define ufshcd_set_link_hibern8(hba) ((hba)->uic_link_state = \
128				    UIC_LINK_HIBERN8_STATE)
129
130/*
131 * UFS Power management levels.
132 * Each level is in increasing order of power savings.
133 */
134enum ufs_pm_level {
135	UFS_PM_LVL_0, /* UFS_ACTIVE_PWR_MODE, UIC_LINK_ACTIVE_STATE */
136	UFS_PM_LVL_1, /* UFS_ACTIVE_PWR_MODE, UIC_LINK_HIBERN8_STATE */
137	UFS_PM_LVL_2, /* UFS_SLEEP_PWR_MODE, UIC_LINK_ACTIVE_STATE */
138	UFS_PM_LVL_3, /* UFS_SLEEP_PWR_MODE, UIC_LINK_HIBERN8_STATE */
139	UFS_PM_LVL_4, /* UFS_POWERDOWN_PWR_MODE, UIC_LINK_HIBERN8_STATE */
140	UFS_PM_LVL_5, /* UFS_POWERDOWN_PWR_MODE, UIC_LINK_OFF_STATE */
141	UFS_PM_LVL_MAX
142};
143
144struct ufs_pm_lvl_states {
145	enum ufs_dev_pwr_mode dev_state;
146	enum uic_link_state link_state;
147};
148
149/**
150 * struct ufshcd_lrb - local reference block
151 * @utr_descriptor_ptr: UTRD address of the command
152 * @ucd_req_ptr: UCD address of the command
153 * @ucd_rsp_ptr: Response UPIU address for this command
154 * @ucd_prdt_ptr: PRDT address of the command
 
 
 
 
155 * @cmd: pointer to SCSI command
156 * @sense_buffer: pointer to sense buffer address of the SCSI command
157 * @sense_bufflen: Length of the sense buffer
158 * @scsi_status: SCSI status of the command
159 * @command_type: SCSI, UFS, Query.
160 * @task_tag: Task tag of the command
161 * @lun: LUN of the command
162 * @intr_cmd: Interrupt command (doesn't participate in interrupt aggregation)
 
 
 
163 */
164struct ufshcd_lrb {
165	struct utp_transfer_req_desc *utr_descriptor_ptr;
166	struct utp_upiu_req *ucd_req_ptr;
167	struct utp_upiu_rsp *ucd_rsp_ptr;
168	struct ufshcd_sg_entry *ucd_prdt_ptr;
169
 
 
 
 
 
170	struct scsi_cmnd *cmd;
171	u8 *sense_buffer;
172	unsigned int sense_bufflen;
173	int scsi_status;
174
175	int command_type;
176	int task_tag;
177	u8 lun; /* UPIU LUN id field is only 8-bit wide */
178	bool intr_cmd;
 
 
 
 
179};
180
181/**
182 * struct ufs_query - holds relevant data structures for query request
183 * @request: request upiu and function
184 * @descriptor: buffer for sending/receiving descriptor
185 * @response: response upiu and response
186 */
187struct ufs_query {
188	struct ufs_query_req request;
189	u8 *descriptor;
190	struct ufs_query_res response;
191};
192
193/**
194 * struct ufs_dev_cmd - all assosiated fields with device management commands
195 * @type: device management command type - Query, NOP OUT
196 * @lock: lock to allow one command at a time
197 * @complete: internal commands completion
198 * @tag_wq: wait queue until free command slot is available
199 */
200struct ufs_dev_cmd {
201	enum dev_cmd_type type;
202	struct mutex lock;
203	struct completion *complete;
204	wait_queue_head_t tag_wq;
205	struct ufs_query query;
206};
207
 
 
 
 
 
 
 
 
 
 
208/**
209 * struct ufs_clk_info - UFS clock related info
210 * @list: list headed by hba->clk_list_head
211 * @clk: clock node
212 * @name: clock name
213 * @max_freq: maximum frequency supported by the clock
214 * @min_freq: min frequency that can be used for clock scaling
215 * @curr_freq: indicates the current frequency that it is set to
216 * @enabled: variable to check against multiple enable/disable
217 */
218struct ufs_clk_info {
219	struct list_head list;
220	struct clk *clk;
221	const char *name;
222	u32 max_freq;
223	u32 min_freq;
224	u32 curr_freq;
225	bool enabled;
226};
227
228enum ufs_notify_change_status {
229	PRE_CHANGE,
230	POST_CHANGE,
231};
232
233struct ufs_pa_layer_attr {
234	u32 gear_rx;
235	u32 gear_tx;
236	u32 lane_rx;
237	u32 lane_tx;
238	u32 pwr_rx;
239	u32 pwr_tx;
240	u32 hs_rate;
241};
242
243struct ufs_pwr_mode_info {
244	bool is_valid;
245	struct ufs_pa_layer_attr info;
246};
247
248/**
249 * struct ufs_hba_variant_ops - variant specific callbacks
250 * @name: variant name
251 * @init: called when the driver is initialized
252 * @exit: called to cleanup everything done in init
253 * @get_ufs_hci_version: called to get UFS HCI version
254 * @clk_scale_notify: notifies that clks are scaled up/down
255 * @setup_clocks: called before touching any of the controller registers
256 * @setup_regulators: called before accessing the host controller
257 * @hce_enable_notify: called before and after HCE enable bit is set to allow
258 *                     variant specific Uni-Pro initialization.
259 * @link_startup_notify: called before and after Link startup is carried out
260 *                       to allow variant specific Uni-Pro initialization.
261 * @pwr_change_notify: called before and after a power mode change
262 *			is carried out to allow vendor spesific capabilities
263 *			to be set.
 
 
 
 
 
 
264 * @suspend: called during host controller PM callback
265 * @resume: called during host controller PM callback
266 * @dbg_register_dump: used to dump controller debug information
 
267 */
268struct ufs_hba_variant_ops {
269	const char *name;
270	int	(*init)(struct ufs_hba *);
271	void    (*exit)(struct ufs_hba *);
272	u32	(*get_ufs_hci_version)(struct ufs_hba *);
273	int	(*clk_scale_notify)(struct ufs_hba *, bool,
274				    enum ufs_notify_change_status);
275	int	(*setup_clocks)(struct ufs_hba *, bool);
 
276	int     (*setup_regulators)(struct ufs_hba *, bool);
277	int	(*hce_enable_notify)(struct ufs_hba *,
278				     enum ufs_notify_change_status);
279	int	(*link_startup_notify)(struct ufs_hba *,
280				       enum ufs_notify_change_status);
281	int	(*pwr_change_notify)(struct ufs_hba *,
282					enum ufs_notify_change_status status,
283					struct ufs_pa_layer_attr *,
284					struct ufs_pa_layer_attr *);
 
 
 
 
 
285	int     (*suspend)(struct ufs_hba *, enum ufs_pm_op);
286	int     (*resume)(struct ufs_hba *, enum ufs_pm_op);
287	void	(*dbg_register_dump)(struct ufs_hba *hba);
 
288};
289
290/* clock gating state  */
291enum clk_gating_state {
292	CLKS_OFF,
293	CLKS_ON,
294	REQ_CLKS_OFF,
295	REQ_CLKS_ON,
296};
297
298/**
299 * struct ufs_clk_gating - UFS clock gating related info
300 * @gate_work: worker to turn off clocks after some delay as specified in
301 * delay_ms
302 * @ungate_work: worker to turn on clocks that will be used in case of
303 * interrupt context
304 * @state: the current clocks state
305 * @delay_ms: gating delay in ms
306 * @is_suspended: clk gating is suspended when set to 1 which can be used
307 * during suspend/resume
308 * @delay_attr: sysfs attribute to control delay_attr
 
 
309 * @active_reqs: number of requests that are pending and should be waited for
310 * completion before gating clocks.
311 */
312struct ufs_clk_gating {
313	struct delayed_work gate_work;
314	struct work_struct ungate_work;
315	enum clk_gating_state state;
316	unsigned long delay_ms;
317	bool is_suspended;
318	struct device_attribute delay_attr;
 
 
319	int active_reqs;
320};
321
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
322struct ufs_clk_scaling {
323	ktime_t  busy_start_t;
 
 
 
 
 
 
 
 
 
324	bool is_busy_started;
325	unsigned long  tot_busy_t;
326	unsigned long window_start_t;
327};
328
329/**
330 * struct ufs_init_prefetch - contains data that is pre-fetched once during
331 * initialization
332 * @icc_level: icc level which was read during initialization
333 */
334struct ufs_init_prefetch {
335	u32 icc_level;
336};
337
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
338/**
339 * struct ufs_hba - per adapter private structure
340 * @mmio_base: UFSHCI base register address
341 * @ucdl_base_addr: UFS Command Descriptor base address
342 * @utrdl_base_addr: UTP Transfer Request Descriptor base address
343 * @utmrdl_base_addr: UTP Task Management Descriptor base address
344 * @ucdl_dma_addr: UFS Command Descriptor DMA address
345 * @utrdl_dma_addr: UTRDL DMA address
346 * @utmrdl_dma_addr: UTMRDL DMA address
347 * @host: Scsi_Host instance of the driver
348 * @dev: device handle
349 * @lrb: local reference block
350 * @lrb_in_use: lrb in use
351 * @outstanding_tasks: Bits representing outstanding task requests
352 * @outstanding_reqs: Bits representing outstanding transfer requests
353 * @capabilities: UFS Controller Capabilities
354 * @nutrs: Transfer Request Queue depth supported by controller
355 * @nutmrs: Task Management Queue depth supported by controller
356 * @ufs_version: UFS Version to which controller complies
357 * @vops: pointer to variant specific operations
358 * @priv: pointer to variant specific private data
359 * @irq: Irq number of the controller
360 * @active_uic_cmd: handle of active UIC command
361 * @uic_cmd_mutex: mutex for uic command
362 * @tm_wq: wait queue for task management
363 * @tm_tag_wq: wait queue for free task management slots
364 * @tm_slots_in_use: bit map of task management request slots in use
365 * @pwr_done: completion for power mode change
366 * @tm_condition: condition variable for task management
367 * @ufshcd_state: UFSHCD states
368 * @eh_flags: Error handling flags
369 * @intr_mask: Interrupt Mask Bits
370 * @ee_ctrl_mask: Exception event control mask
371 * @is_powered: flag to check if HBA is powered
372 * @is_init_prefetch: flag to check if data was pre-fetched in initialization
373 * @init_prefetch_data: data pre-fetched during initialization
374 * @eh_work: Worker to handle UFS errors that require s/w attention
375 * @eeh_work: Worker to handle exception events
376 * @errors: HBA errors
377 * @uic_error: UFS interconnect layer error status
378 * @saved_err: sticky error mask
379 * @saved_uic_err: sticky UIC error mask
380 * @dev_cmd: ufs device management command information
381 * @last_dme_cmd_tstamp: time stamp of the last completed DME command
382 * @auto_bkops_enabled: to track whether bkops is enabled in device
383 * @vreg_info: UFS device voltage regulator information
384 * @clk_list_head: UFS host controller clocks list node head
385 * @pwr_info: holds current power mode
386 * @max_pwr_info: keeps the device max valid pwm
 
387 * @urgent_bkops_lvl: keeps track of urgent bkops level for device
388 * @is_urgent_bkops_lvl_checked: keeps track if the urgent bkops level for
389 *  device is known or not.
390 */
391struct ufs_hba {
392	void __iomem *mmio_base;
393
394	/* Virtual memory reference */
395	struct utp_transfer_cmd_desc *ucdl_base_addr;
396	struct utp_transfer_req_desc *utrdl_base_addr;
397	struct utp_task_req_desc *utmrdl_base_addr;
398
399	/* DMA memory reference */
400	dma_addr_t ucdl_dma_addr;
401	dma_addr_t utrdl_dma_addr;
402	dma_addr_t utmrdl_dma_addr;
403
404	struct Scsi_Host *host;
405	struct device *dev;
406	/*
407	 * This field is to keep a reference to "scsi_device" corresponding to
408	 * "UFS device" W-LU.
409	 */
410	struct scsi_device *sdev_ufs_device;
411
412	enum ufs_dev_pwr_mode curr_dev_pwr_mode;
413	enum uic_link_state uic_link_state;
414	/* Desired UFS power management level during runtime PM */
415	enum ufs_pm_level rpm_lvl;
416	/* Desired UFS power management level during system PM */
417	enum ufs_pm_level spm_lvl;
 
 
418	int pm_op_in_progress;
419
 
 
 
420	struct ufshcd_lrb *lrb;
421	unsigned long lrb_in_use;
422
423	unsigned long outstanding_tasks;
424	unsigned long outstanding_reqs;
425
426	u32 capabilities;
427	int nutrs;
428	int nutmrs;
429	u32 ufs_version;
430	struct ufs_hba_variant_ops *vops;
431	void *priv;
432	unsigned int irq;
433	bool is_irq_enabled;
434
435	/* Interrupt aggregation support is broken */
436	#define UFSHCD_QUIRK_BROKEN_INTR_AGGR			UFS_BIT(0)
437
438	/*
439	 * delay before each dme command is required as the unipro
440	 * layer has shown instabilities
441	 */
442	#define UFSHCD_QUIRK_DELAY_BEFORE_DME_CMDS		UFS_BIT(1)
443
444	/*
445	 * If UFS host controller is having issue in processing LCC (Line
446	 * Control Command) coming from device then enable this quirk.
447	 * When this quirk is enabled, host controller driver should disable
448	 * the LCC transmission on UFS device (by clearing TX_LCC_ENABLE
449	 * attribute of device to 0).
450	 */
451	#define UFSHCD_QUIRK_BROKEN_LCC				UFS_BIT(2)
452
453	/*
454	 * The attribute PA_RXHSUNTERMCAP specifies whether or not the
455	 * inbound Link supports unterminated line in HS mode. Setting this
456	 * attribute to 1 fixes moving to HS gear.
457	 */
458	#define UFSHCD_QUIRK_BROKEN_PA_RXHSUNTERMCAP		UFS_BIT(3)
459
460	/*
461	 * This quirk needs to be enabled if the host contoller only allows
462	 * accessing the peer dme attributes in AUTO mode (FAST AUTO or
463	 * SLOW AUTO).
464	 */
465	#define UFSHCD_QUIRK_DME_PEER_ACCESS_AUTO_MODE		UFS_BIT(4)
466
467	/*
468	 * This quirk needs to be enabled if the host contoller doesn't
469	 * advertise the correct version in UFS_VER register. If this quirk
470	 * is enabled, standard UFS host driver will call the vendor specific
471	 * ops (get_ufs_hci_version) to get the correct version.
472	 */
473	#define UFSHCD_QUIRK_BROKEN_UFS_HCI_VERSION		UFS_BIT(5)
 
 
 
 
 
 
474
475	unsigned int quirks;	/* Deviations from standard UFSHCI spec. */
476
477	/* Device deviations from standard UFS device spec. */
478	unsigned int dev_quirks;
479
480	wait_queue_head_t tm_wq;
481	wait_queue_head_t tm_tag_wq;
482	unsigned long tm_condition;
483	unsigned long tm_slots_in_use;
484
485	struct uic_command *active_uic_cmd;
486	struct mutex uic_cmd_mutex;
487	struct completion *uic_async_done;
488
489	u32 ufshcd_state;
490	u32 eh_flags;
491	u32 intr_mask;
492	u16 ee_ctrl_mask;
493	bool is_powered;
494	bool is_init_prefetch;
495	struct ufs_init_prefetch init_prefetch_data;
496
497	/* Work Queues */
498	struct work_struct eh_work;
499	struct work_struct eeh_work;
500
501	/* HBA Errors */
502	u32 errors;
503	u32 uic_error;
504	u32 saved_err;
505	u32 saved_uic_err;
 
506
507	/* Device management request data */
508	struct ufs_dev_cmd dev_cmd;
509	ktime_t last_dme_cmd_tstamp;
510
511	/* Keeps information of the UFS device connected to this host */
512	struct ufs_dev_info dev_info;
513	bool auto_bkops_enabled;
514	struct ufs_vreg_info vreg_info;
515	struct list_head clk_list_head;
516
517	bool wlun_dev_clr_ua;
518
 
 
 
519	/* Number of lanes available (1 or 2) for Rx/Tx */
520	u32 lanes_per_direction;
521	struct ufs_pa_layer_attr pwr_info;
522	struct ufs_pwr_mode_info max_pwr_info;
523
524	struct ufs_clk_gating clk_gating;
525	/* Control to enable/disable host capabilities */
526	u32 caps;
527	/* Allow dynamic clk gating */
528#define UFSHCD_CAP_CLK_GATING	(1 << 0)
529	/* Allow hiberb8 with clk gating */
530#define UFSHCD_CAP_HIBERN8_WITH_CLK_GATING (1 << 1)
531	/* Allow dynamic clk scaling */
532#define UFSHCD_CAP_CLK_SCALING	(1 << 2)
533	/* Allow auto bkops to enabled during runtime suspend */
534#define UFSHCD_CAP_AUTO_BKOPS_SUSPEND (1 << 3)
535	/*
536	 * This capability allows host controller driver to use the UFS HCI's
537	 * interrupt aggregation capability.
538	 * CAUTION: Enabling this might reduce overall UFS throughput.
539	 */
540#define UFSHCD_CAP_INTR_AGGR (1 << 4)
 
 
 
 
 
 
 
 
541
542	struct devfreq *devfreq;
543	struct ufs_clk_scaling clk_scaling;
544	bool is_sys_suspended;
545
546	enum bkops_status urgent_bkops_lvl;
547	bool is_urgent_bkops_lvl_checked;
 
 
 
548};
549
550/* Returns true if clocks can be gated. Otherwise false */
551static inline bool ufshcd_is_clkgating_allowed(struct ufs_hba *hba)
552{
553	return hba->caps & UFSHCD_CAP_CLK_GATING;
554}
555static inline bool ufshcd_can_hibern8_during_gating(struct ufs_hba *hba)
556{
557	return hba->caps & UFSHCD_CAP_HIBERN8_WITH_CLK_GATING;
558}
559static inline int ufshcd_is_clkscaling_enabled(struct ufs_hba *hba)
560{
561	return hba->caps & UFSHCD_CAP_CLK_SCALING;
562}
563static inline bool ufshcd_can_autobkops_during_suspend(struct ufs_hba *hba)
564{
565	return hba->caps & UFSHCD_CAP_AUTO_BKOPS_SUSPEND;
566}
567
568static inline bool ufshcd_is_intr_aggr_allowed(struct ufs_hba *hba)
569{
 
 
570	if ((hba->caps & UFSHCD_CAP_INTR_AGGR) &&
571	    !(hba->quirks & UFSHCD_QUIRK_BROKEN_INTR_AGGR))
572		return true;
573	else
574		return false;
 
 
 
575}
576
577#define ufshcd_writel(hba, val, reg)	\
578	writel((val), (hba)->mmio_base + (reg))
579#define ufshcd_readl(hba, reg)	\
580	readl((hba)->mmio_base + (reg))
581
582/**
583 * ufshcd_rmwl - read modify write into a register
584 * @hba - per adapter instance
585 * @mask - mask to apply on read value
586 * @val - actual value to write
587 * @reg - register address
588 */
589static inline void ufshcd_rmwl(struct ufs_hba *hba, u32 mask, u32 val, u32 reg)
590{
591	u32 tmp;
592
593	tmp = ufshcd_readl(hba, reg);
594	tmp &= ~mask;
595	tmp |= (val & mask);
596	ufshcd_writel(hba, tmp, reg);
597}
598
599int ufshcd_alloc_host(struct device *, struct ufs_hba **);
600void ufshcd_dealloc_host(struct ufs_hba *);
601int ufshcd_init(struct ufs_hba * , void __iomem * , unsigned int);
602void ufshcd_remove(struct ufs_hba *);
603int ufshcd_wait_for_register(struct ufs_hba *hba, u32 reg, u32 mask,
604				u32 val, unsigned long interval_us,
605				unsigned long timeout_ms, bool can_sleep);
606
607static inline void check_upiu_size(void)
608{
609	BUILD_BUG_ON(ALIGNED_UPIU_SIZE <
610		GENERAL_UPIU_REQUEST_SIZE + QUERY_DESC_MAX_SIZE);
611}
612
613/**
614 * ufshcd_set_variant - set variant specific data to the hba
615 * @hba - per adapter instance
616 * @variant - pointer to variant specific data
617 */
618static inline void ufshcd_set_variant(struct ufs_hba *hba, void *variant)
619{
620	BUG_ON(!hba);
621	hba->priv = variant;
622}
623
624/**
625 * ufshcd_get_variant - get variant specific data from the hba
626 * @hba - per adapter instance
627 */
628static inline void *ufshcd_get_variant(struct ufs_hba *hba)
629{
630	BUG_ON(!hba);
631	return hba->priv;
632}
 
 
 
 
 
633
634extern int ufshcd_runtime_suspend(struct ufs_hba *hba);
635extern int ufshcd_runtime_resume(struct ufs_hba *hba);
636extern int ufshcd_runtime_idle(struct ufs_hba *hba);
637extern int ufshcd_system_suspend(struct ufs_hba *hba);
638extern int ufshcd_system_resume(struct ufs_hba *hba);
639extern int ufshcd_shutdown(struct ufs_hba *hba);
640extern int ufshcd_dme_set_attr(struct ufs_hba *hba, u32 attr_sel,
641			       u8 attr_set, u32 mib_val, u8 peer);
642extern int ufshcd_dme_get_attr(struct ufs_hba *hba, u32 attr_sel,
643			       u32 *mib_val, u8 peer);
644
645/* UIC command interfaces for DME primitives */
646#define DME_LOCAL	0
647#define DME_PEER	1
648#define ATTR_SET_NOR	0	/* NORMAL */
649#define ATTR_SET_ST	1	/* STATIC */
650
651static inline int ufshcd_dme_set(struct ufs_hba *hba, u32 attr_sel,
652				 u32 mib_val)
653{
654	return ufshcd_dme_set_attr(hba, attr_sel, ATTR_SET_NOR,
655				   mib_val, DME_LOCAL);
656}
657
658static inline int ufshcd_dme_st_set(struct ufs_hba *hba, u32 attr_sel,
659				    u32 mib_val)
660{
661	return ufshcd_dme_set_attr(hba, attr_sel, ATTR_SET_ST,
662				   mib_val, DME_LOCAL);
663}
664
665static inline int ufshcd_dme_peer_set(struct ufs_hba *hba, u32 attr_sel,
666				      u32 mib_val)
667{
668	return ufshcd_dme_set_attr(hba, attr_sel, ATTR_SET_NOR,
669				   mib_val, DME_PEER);
670}
671
672static inline int ufshcd_dme_peer_st_set(struct ufs_hba *hba, u32 attr_sel,
673					 u32 mib_val)
674{
675	return ufshcd_dme_set_attr(hba, attr_sel, ATTR_SET_ST,
676				   mib_val, DME_PEER);
677}
678
679static inline int ufshcd_dme_get(struct ufs_hba *hba,
680				 u32 attr_sel, u32 *mib_val)
681{
682	return ufshcd_dme_get_attr(hba, attr_sel, mib_val, DME_LOCAL);
683}
684
685static inline int ufshcd_dme_peer_get(struct ufs_hba *hba,
686				      u32 attr_sel, u32 *mib_val)
687{
688	return ufshcd_dme_get_attr(hba, attr_sel, mib_val, DME_PEER);
689}
690
691int ufshcd_read_device_desc(struct ufs_hba *hba, u8 *buf, u32 size);
692
693static inline bool ufshcd_is_hs_mode(struct ufs_pa_layer_attr *pwr_info)
694{
695	return (pwr_info->pwr_rx == FAST_MODE ||
696		pwr_info->pwr_rx == FASTAUTO_MODE) &&
697		(pwr_info->pwr_tx == FAST_MODE ||
698		pwr_info->pwr_tx == FASTAUTO_MODE);
699}
700
701#define ASCII_STD true
702
703int ufshcd_read_string_desc(struct ufs_hba *hba, int desc_index, u8 *buf,
704				u32 size, bool ascii);
705
706/* Expose Query-Request API */
 
 
 
 
 
 
 
 
 
 
 
 
 
707int ufshcd_query_flag(struct ufs_hba *hba, enum query_opcode opcode,
708	enum flag_idn idn, bool *flag_res);
 
 
 
709int ufshcd_hold(struct ufs_hba *hba, bool async);
710void ufshcd_release(struct ufs_hba *hba);
 
 
 
 
711u32 ufshcd_get_local_unipro_ver(struct ufs_hba *hba);
712
713/* Wrapper functions for safely calling variant operations */
714static inline const char *ufshcd_get_var_name(struct ufs_hba *hba)
715{
716	if (hba->vops)
717		return hba->vops->name;
718	return "";
719}
720
721static inline int ufshcd_vops_init(struct ufs_hba *hba)
722{
723	if (hba->vops && hba->vops->init)
724		return hba->vops->init(hba);
725
726	return 0;
727}
728
729static inline void ufshcd_vops_exit(struct ufs_hba *hba)
730{
731	if (hba->vops && hba->vops->exit)
732		return hba->vops->exit(hba);
733}
734
735static inline u32 ufshcd_vops_get_ufs_hci_version(struct ufs_hba *hba)
736{
737	if (hba->vops && hba->vops->get_ufs_hci_version)
738		return hba->vops->get_ufs_hci_version(hba);
739
740	return ufshcd_readl(hba, REG_UFS_VERSION);
741}
742
743static inline int ufshcd_vops_clk_scale_notify(struct ufs_hba *hba,
744			bool up, enum ufs_notify_change_status status)
745{
746	if (hba->vops && hba->vops->clk_scale_notify)
747		return hba->vops->clk_scale_notify(hba, up, status);
748	return 0;
749}
750
751static inline int ufshcd_vops_setup_clocks(struct ufs_hba *hba, bool on)
 
752{
753	if (hba->vops && hba->vops->setup_clocks)
754		return hba->vops->setup_clocks(hba, on);
755	return 0;
756}
757
758static inline int ufshcd_vops_setup_regulators(struct ufs_hba *hba, bool status)
759{
760	if (hba->vops && hba->vops->setup_regulators)
761		return hba->vops->setup_regulators(hba, status);
762
763	return 0;
764}
765
766static inline int ufshcd_vops_hce_enable_notify(struct ufs_hba *hba,
767						bool status)
768{
769	if (hba->vops && hba->vops->hce_enable_notify)
770		return hba->vops->hce_enable_notify(hba, status);
771
772	return 0;
773}
774static inline int ufshcd_vops_link_startup_notify(struct ufs_hba *hba,
775						bool status)
776{
777	if (hba->vops && hba->vops->link_startup_notify)
778		return hba->vops->link_startup_notify(hba, status);
779
780	return 0;
781}
782
783static inline int ufshcd_vops_pwr_change_notify(struct ufs_hba *hba,
784				  bool status,
785				  struct ufs_pa_layer_attr *dev_max_params,
786				  struct ufs_pa_layer_attr *dev_req_params)
787{
788	if (hba->vops && hba->vops->pwr_change_notify)
789		return hba->vops->pwr_change_notify(hba, status,
790					dev_max_params, dev_req_params);
791
792	return -ENOTSUPP;
793}
794
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
795static inline int ufshcd_vops_suspend(struct ufs_hba *hba, enum ufs_pm_op op)
796{
797	if (hba->vops && hba->vops->suspend)
798		return hba->vops->suspend(hba, op);
799
800	return 0;
801}
802
803static inline int ufshcd_vops_resume(struct ufs_hba *hba, enum ufs_pm_op op)
804{
805	if (hba->vops && hba->vops->resume)
806		return hba->vops->resume(hba, op);
807
808	return 0;
809}
810
811static inline void ufshcd_vops_dbg_register_dump(struct ufs_hba *hba)
812{
813	if (hba->vops && hba->vops->dbg_register_dump)
814		hba->vops->dbg_register_dump(hba);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
815}
816
817#endif /* End of Header */