Commit b9d10446 authored by Avri Altman's avatar Avri Altman Committed by Martin K. Petersen
Browse files

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: default avatarKeoseong Park <keosung.park@samsung.com>
Reviewed-by: default avatarBart Van Assche <bvanassche@acm.org>
Reviewed-by: default avatarBean Huo <beanhuo@micron.com>
Signed-off-by: default avatarAvri Altman <avri.altman@wdc.com>
Link: https://lore.kernel.org/r/20240811143757.2538212-2-avri.altman@wdc.com


Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 992f9884
Loading
Loading
Loading
Loading
+22 −16
Original line number Diff line number Diff line
@@ -198,6 +198,24 @@ static u32 ufshcd_us_to_ahit(unsigned int timer)
	       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,
				 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))
		return -EOPNOTSUPP;

	down(&hba->host_sem);
	if (!ufshcd_is_user_access_allowed(hba)) {
		ret = -EBUSY;
		goto out;
	}

	pm_runtime_get_sync(hba->dev);
	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);
	ret = ufshcd_read_hci_reg(hba, &ahit, REG_AUTO_HIBERNATE_IDLE_TIMER);
	if (ret)
		return ret;

	return sysfs_emit(buf, "%d\n", ufshcd_ahit_to_us(ahit));
}

static ssize_t auto_hibern8_store(struct device *dev,
+3 −2
Original line number Diff line number Diff line
@@ -25,8 +25,9 @@ enum {
	REG_CONTROLLER_CAPABILITIES		= 0x00,
	REG_MCQCAP				= 0x04,
	REG_UFS_VERSION				= 0x08,
	REG_CONTROLLER_DEV_ID			= 0x10,
	REG_CONTROLLER_PROD_ID			= 0x14,
	REG_EXT_CONTROLLER_CAPABILITIES		= 0x0C,
	REG_CONTROLLER_PID			= 0x10,
	REG_CONTROLLER_MID			= 0x14,
	REG_AUTO_HIBERNATE_IDLE_TIMER		= 0x18,
	REG_INTERRUPT_STATUS			= 0x20,
	REG_INTERRUPT_ENABLE			= 0x24,