diff options
| -rw-r--r-- | drivers/scsi/ufs/ufshcd.c | 2 | ||||
| -rw-r--r-- | drivers/scsi/ufs/ufshcd.h | 18 | ||||
| -rw-r--r-- | drivers/scsi/ufs/unipro.h | 56 |
3 files changed, 76 insertions, 0 deletions
diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c index 3a2de56fe080..497c38a4a866 100644 --- a/drivers/scsi/ufs/ufshcd.c +++ b/drivers/scsi/ufs/ufshcd.c | |||
| @@ -5114,6 +5114,8 @@ int ufshcd_system_suspend(struct ufs_hba *hba) | |||
| 5114 | 5114 | ||
| 5115 | ret = ufshcd_suspend(hba, UFS_SYSTEM_PM); | 5115 | ret = ufshcd_suspend(hba, UFS_SYSTEM_PM); |
| 5116 | out: | 5116 | out: |
| 5117 | if (!ret) | ||
| 5118 | hba->is_sys_suspended = true; | ||
| 5117 | return ret; | 5119 | return ret; |
| 5118 | } | 5120 | } |
| 5119 | EXPORT_SYMBOL(ufshcd_system_suspend); | 5121 | EXPORT_SYMBOL(ufshcd_system_suspend); |
diff --git a/drivers/scsi/ufs/ufshcd.h b/drivers/scsi/ufs/ufshcd.h index d7fec869d590..58ecdff5065c 100644 --- a/drivers/scsi/ufs/ufshcd.h +++ b/drivers/scsi/ufs/ufshcd.h | |||
| @@ -474,6 +474,7 @@ struct ufs_hba { | |||
| 474 | 474 | ||
| 475 | struct devfreq *devfreq; | 475 | struct devfreq *devfreq; |
| 476 | struct ufs_clk_scaling clk_scaling; | 476 | struct ufs_clk_scaling clk_scaling; |
| 477 | bool is_sys_suspended; | ||
| 477 | }; | 478 | }; |
| 478 | 479 | ||
| 479 | /* Returns true if clocks can be gated. Otherwise false */ | 480 | /* Returns true if clocks can be gated. Otherwise false */ |
| @@ -499,6 +500,23 @@ static inline bool ufshcd_can_autobkops_during_suspend(struct ufs_hba *hba) | |||
| 499 | #define ufshcd_readl(hba, reg) \ | 500 | #define ufshcd_readl(hba, reg) \ |
| 500 | readl((hba)->mmio_base + (reg)) | 501 | readl((hba)->mmio_base + (reg)) |
| 501 | 502 | ||
| 503 | /** | ||
| 504 | * ufshcd_rmwl - read modify write into a register | ||
| 505 | * @hba - per adapter instance | ||
| 506 | * @mask - mask to apply on read value | ||
| 507 | * @val - actual value to write | ||
| 508 | * @reg - register address | ||
| 509 | */ | ||
| 510 | static inline void ufshcd_rmwl(struct ufs_hba *hba, u32 mask, u32 val, u32 reg) | ||
| 511 | { | ||
| 512 | u32 tmp; | ||
| 513 | |||
| 514 | tmp = ufshcd_readl(hba, reg); | ||
| 515 | tmp &= ~mask; | ||
| 516 | tmp |= (val & mask); | ||
| 517 | ufshcd_writel(hba, tmp, reg); | ||
| 518 | } | ||
| 519 | |||
| 502 | int ufshcd_alloc_host(struct device *, struct ufs_hba **); | 520 | int ufshcd_alloc_host(struct device *, struct ufs_hba **); |
| 503 | int ufshcd_init(struct ufs_hba * , void __iomem * , unsigned int); | 521 | int ufshcd_init(struct ufs_hba * , void __iomem * , unsigned int); |
| 504 | void ufshcd_remove(struct ufs_hba *); | 522 | void ufshcd_remove(struct ufs_hba *); |
diff --git a/drivers/scsi/ufs/unipro.h b/drivers/scsi/ufs/unipro.h index 0bb8041c047a..3fc3e21b746b 100644 --- a/drivers/scsi/ufs/unipro.h +++ b/drivers/scsi/ufs/unipro.h | |||
| @@ -13,6 +13,44 @@ | |||
| 13 | #define _UNIPRO_H_ | 13 | #define _UNIPRO_H_ |
| 14 | 14 | ||
| 15 | /* | 15 | /* |
| 16 | * M-TX Configuration Attributes | ||
| 17 | */ | ||
| 18 | #define TX_MODE 0x0021 | ||
| 19 | #define TX_HSRATE_SERIES 0x0022 | ||
| 20 | #define TX_HSGEAR 0x0023 | ||
| 21 | #define TX_PWMGEAR 0x0024 | ||
| 22 | #define TX_AMPLITUDE 0x0025 | ||
| 23 | #define TX_HS_SLEWRATE 0x0026 | ||
| 24 | #define TX_SYNC_SOURCE 0x0027 | ||
| 25 | #define TX_HS_SYNC_LENGTH 0x0028 | ||
| 26 | #define TX_HS_PREPARE_LENGTH 0x0029 | ||
| 27 | #define TX_LS_PREPARE_LENGTH 0x002A | ||
| 28 | #define TX_HIBERN8_CONTROL 0x002B | ||
| 29 | #define TX_LCC_ENABLE 0x002C | ||
| 30 | #define TX_PWM_BURST_CLOSURE_EXTENSION 0x002D | ||
| 31 | #define TX_BYPASS_8B10B_ENABLE 0x002E | ||
| 32 | #define TX_DRIVER_POLARITY 0x002F | ||
| 33 | #define TX_HS_UNTERMINATED_LINE_DRIVE_ENABLE 0x0030 | ||
| 34 | #define TX_LS_TERMINATED_LINE_DRIVE_ENABLE 0x0031 | ||
| 35 | #define TX_LCC_SEQUENCER 0x0032 | ||
| 36 | #define TX_MIN_ACTIVATETIME 0x0033 | ||
| 37 | #define TX_PWM_G6_G7_SYNC_LENGTH 0x0034 | ||
| 38 | |||
| 39 | /* | ||
| 40 | * M-RX Configuration Attributes | ||
| 41 | */ | ||
| 42 | #define RX_MODE 0x00A1 | ||
| 43 | #define RX_HSRATE_SERIES 0x00A2 | ||
| 44 | #define RX_HSGEAR 0x00A3 | ||
| 45 | #define RX_PWMGEAR 0x00A4 | ||
| 46 | #define RX_LS_TERMINATED_ENABLE 0x00A5 | ||
| 47 | #define RX_HS_UNTERMINATED_ENABLE 0x00A6 | ||
| 48 | #define RX_ENTER_HIBERN8 0x00A7 | ||
| 49 | #define RX_BYPASS_8B10B_ENABLE 0x00A8 | ||
| 50 | #define RX_TERMINATION_FORCE_ENABLE 0x0089 | ||
| 51 | |||
| 52 | #define is_mphy_tx_attr(attr) (attr < RX_MODE) | ||
| 53 | /* | ||
| 16 | * PHY Adpater attributes | 54 | * PHY Adpater attributes |
| 17 | */ | 55 | */ |
| 18 | #define PA_ACTIVETXDATALANES 0x1560 | 56 | #define PA_ACTIVETXDATALANES 0x1560 |
| @@ -87,6 +125,24 @@ enum { | |||
| 87 | PA_HS_MODE_B = 2, | 125 | PA_HS_MODE_B = 2, |
| 88 | }; | 126 | }; |
| 89 | 127 | ||
| 128 | enum ufs_pwm_gear_tag { | ||
| 129 | UFS_PWM_DONT_CHANGE, /* Don't change Gear */ | ||
| 130 | UFS_PWM_G1, /* PWM Gear 1 (default for reset) */ | ||
| 131 | UFS_PWM_G2, /* PWM Gear 2 */ | ||
| 132 | UFS_PWM_G3, /* PWM Gear 3 */ | ||
| 133 | UFS_PWM_G4, /* PWM Gear 4 */ | ||
| 134 | UFS_PWM_G5, /* PWM Gear 5 */ | ||
| 135 | UFS_PWM_G6, /* PWM Gear 6 */ | ||
| 136 | UFS_PWM_G7, /* PWM Gear 7 */ | ||
| 137 | }; | ||
| 138 | |||
| 139 | enum ufs_hs_gear_tag { | ||
| 140 | UFS_HS_DONT_CHANGE, /* Don't change Gear */ | ||
| 141 | UFS_HS_G1, /* HS Gear 1 (default for reset) */ | ||
| 142 | UFS_HS_G2, /* HS Gear 2 */ | ||
| 143 | UFS_HS_G3, /* HS Gear 3 */ | ||
| 144 | }; | ||
| 145 | |||
| 90 | /* | 146 | /* |
| 91 | * Data Link Layer Attributes | 147 | * Data Link Layer Attributes |
| 92 | */ | 148 | */ |
