mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-01-15 09:34:17 +00:00
scsi: ufs: Prepare to add HCI capabilities sysfs
Prepare so we'll be able to read various other HCI registers. While at it, fix the HCPID & HCMID register names to stand for what they really are. Also replace the pm_runtime_{get/put}_sync() calls in auto_hibern8_show to ufshcd_rpm_{get/put}_sync() as any host controller register reads should. Reviewed-by: Keoseong Park <keosung.park@samsung.com> Reviewed-by: Bart Van Assche <bvanassche@acm.org> Reviewed-by: Bean Huo <beanhuo@micron.com> Signed-off-by: Avri Altman <avri.altman@wdc.com> Link: https://lore.kernel.org/r/20240811143757.2538212-2-avri.altman@wdc.com Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
This commit is contained in:
parent
992f988462
commit
b9d104465a
@ -198,6 +198,24 @@ static u32 ufshcd_us_to_ahit(unsigned int timer)
|
|||||||
FIELD_PREP(UFSHCI_AHIBERN8_SCALE_MASK, scale);
|
FIELD_PREP(UFSHCI_AHIBERN8_SCALE_MASK, scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ufshcd_read_hci_reg(struct ufs_hba *hba, u32 *val, unsigned int reg)
|
||||||
|
{
|
||||||
|
down(&hba->host_sem);
|
||||||
|
if (!ufshcd_is_user_access_allowed(hba)) {
|
||||||
|
up(&hba->host_sem);
|
||||||
|
return -EBUSY;
|
||||||
|
}
|
||||||
|
|
||||||
|
ufshcd_rpm_get_sync(hba);
|
||||||
|
ufshcd_hold(hba);
|
||||||
|
*val = ufshcd_readl(hba, reg);
|
||||||
|
ufshcd_release(hba);
|
||||||
|
ufshcd_rpm_put_sync(hba);
|
||||||
|
|
||||||
|
up(&hba->host_sem);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static ssize_t auto_hibern8_show(struct device *dev,
|
static ssize_t auto_hibern8_show(struct device *dev,
|
||||||
struct device_attribute *attr, char *buf)
|
struct device_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
@ -208,23 +226,11 @@ static ssize_t auto_hibern8_show(struct device *dev,
|
|||||||
if (!ufshcd_is_auto_hibern8_supported(hba))
|
if (!ufshcd_is_auto_hibern8_supported(hba))
|
||||||
return -EOPNOTSUPP;
|
return -EOPNOTSUPP;
|
||||||
|
|
||||||
down(&hba->host_sem);
|
ret = ufshcd_read_hci_reg(hba, &ahit, REG_AUTO_HIBERNATE_IDLE_TIMER);
|
||||||
if (!ufshcd_is_user_access_allowed(hba)) {
|
if (ret)
|
||||||
ret = -EBUSY;
|
return ret;
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
pm_runtime_get_sync(hba->dev);
|
return sysfs_emit(buf, "%d\n", ufshcd_ahit_to_us(ahit));
|
||||||
ufshcd_hold(hba);
|
|
||||||
ahit = ufshcd_readl(hba, REG_AUTO_HIBERNATE_IDLE_TIMER);
|
|
||||||
ufshcd_release(hba);
|
|
||||||
pm_runtime_put_sync(hba->dev);
|
|
||||||
|
|
||||||
ret = sysfs_emit(buf, "%d\n", ufshcd_ahit_to_us(ahit));
|
|
||||||
|
|
||||||
out:
|
|
||||||
up(&hba->host_sem);
|
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t auto_hibern8_store(struct device *dev,
|
static ssize_t auto_hibern8_store(struct device *dev,
|
||||||
|
@ -25,8 +25,9 @@ enum {
|
|||||||
REG_CONTROLLER_CAPABILITIES = 0x00,
|
REG_CONTROLLER_CAPABILITIES = 0x00,
|
||||||
REG_MCQCAP = 0x04,
|
REG_MCQCAP = 0x04,
|
||||||
REG_UFS_VERSION = 0x08,
|
REG_UFS_VERSION = 0x08,
|
||||||
REG_CONTROLLER_DEV_ID = 0x10,
|
REG_EXT_CONTROLLER_CAPABILITIES = 0x0C,
|
||||||
REG_CONTROLLER_PROD_ID = 0x14,
|
REG_CONTROLLER_PID = 0x10,
|
||||||
|
REG_CONTROLLER_MID = 0x14,
|
||||||
REG_AUTO_HIBERNATE_IDLE_TIMER = 0x18,
|
REG_AUTO_HIBERNATE_IDLE_TIMER = 0x18,
|
||||||
REG_INTERRUPT_STATUS = 0x20,
|
REG_INTERRUPT_STATUS = 0x20,
|
||||||
REG_INTERRUPT_ENABLE = 0x24,
|
REG_INTERRUPT_ENABLE = 0x24,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user