Commit 24a31ea9 authored by Basavaraj Natikar's avatar Basavaraj Natikar Committed by Jiri Kosina
Browse files

HID: amd_sfh: Add initial support for HPD sensor



Add Human Presence Detection (HPD) sensors support
on AMD next generation HPD supported platforms.

Signed-off-by: default avatarBasavaraj Natikar <Basavaraj.Natikar@amd.com>
Reviewed-by: default avatarNehal Shah <nehal-bakulchandra.shah@amd.com>
Reviewed-by: default avatarShyam Sundar S K <Shyam-sundar.S-k@amd.com>
Signed-off-by: default avatarJiri Kosina <jkosina@suse.cz>
parent 0aad9c95
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -9,7 +9,7 @@
#ifndef AMDSFH_HID_H
#define AMDSFH_HID_H

#define MAX_HID_DEVICES		4
#define MAX_HID_DEVICES		5
#define BUS_AMD_AMDTP		0x20
#define AMD_SFH_HID_VENDOR	0x1022
#define AMD_SFH_HID_PRODUCT	0x0001
+4 −0
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@
#define ACEL_EN		BIT(0)
#define GYRO_EN		BIT(1)
#define MAGNO_EN	BIT(2)
#define HPD_EN		BIT(16)
#define ALS_EN		BIT(19)

static int sensor_mask_override = -1;
@@ -165,6 +166,9 @@ int amd_mp2_get_sensor_num(struct amd_mp2_dev *privdata, u8 *sensor_id)
	if (ALS_EN & activestatus)
		sensor_id[num_of_sensors++] = als_idx;

	if (HPD_EN & activestatus)
		sensor_id[num_of_sensors++] = HPD_IDX;

	return num_of_sensors;
}

+14 −0
Original line number Diff line number Diff line
@@ -30,6 +30,8 @@

#define V2_STATUS	0x2

#define HPD_IDX		16

/* SFH Command register */
union sfh_cmd_base {
	u32 ul;
@@ -92,6 +94,18 @@ enum mem_use_type {
	USE_C2P_REG,
};

struct hpd_status {
	union {
		struct {
			u32 human_presence_report : 4;
			u32 human_presence_actual : 4;
			u32 probablity		  : 8;
			u32 object_distance       : 16;
		} shpd;
		u32 val;
	};
};

void amd_start_sensor(struct amd_mp2_dev *privdata, struct amd_mp2_sensor_info info);
void amd_stop_sensor(struct amd_mp2_dev *privdata, u16 sensor_idx);
void amd_stop_all_sensors(struct amd_mp2_dev *privdata);
+33 −1
Original line number Diff line number Diff line
@@ -50,6 +50,11 @@ int get_report_descriptor(int sensor_idx, u8 *rep_desc)
		memcpy(rep_desc, als_report_descriptor,
		       sizeof(als_report_descriptor));
		break;
	case HPD_IDX: /* HPD sensor */
		memset(rep_desc, 0, sizeof(hpd_report_descriptor));
		memcpy(rep_desc, hpd_report_descriptor,
		       sizeof(hpd_report_descriptor));
		break;
	default:
		break;
	}
@@ -99,6 +104,17 @@ u32 get_descr_sz(int sensor_idx, int descriptor_name)
			return sizeof(struct als_feature_report);
		}
		break;
	case HPD_IDX:
		switch (descriptor_name) {
		case descr_size:
			return sizeof(hpd_report_descriptor);
		case input_size:
			return sizeof(struct hpd_input_report);
		case feature_size:
			return sizeof(struct hpd_feature_report);
		}
		break;

	default:
		break;
	}
@@ -120,6 +136,7 @@ u8 get_feature_report(int sensor_idx, int report_id, u8 *feature_report)
	struct accel3_feature_report acc_feature;
	struct gyro_feature_report gyro_feature;
	struct magno_feature_report magno_feature;
	struct hpd_feature_report hpd_feature;
	struct als_feature_report als_feature;
	u8 report_size = 0;

@@ -162,6 +179,12 @@ u8 get_feature_report(int sensor_idx, int report_id, u8 *feature_report)
		memcpy(feature_report, &als_feature, sizeof(als_feature));
		report_size = sizeof(als_feature);
		break;
	case HPD_IDX:  /* human presence detection sensor */
		get_common_features(&hpd_feature.common_property, report_id);
		memcpy(feature_report, &hpd_feature, sizeof(hpd_feature));
		report_size = sizeof(hpd_feature);
		break;

	default:
		break;
	}
@@ -181,10 +204,12 @@ u8 get_input_report(u8 current_index, int sensor_idx, int report_id, struct amd_
	u32 *sensor_virt_addr = in_data->sensor_virt_addr[current_index];
	u8 *input_report = in_data->input_report[current_index];
	u8 supported_input = privdata->mp2_acs & GENMASK(3, 0);
	struct magno_input_report magno_input;
	struct accel3_input_report acc_input;
	struct gyro_input_report gyro_input;
	struct magno_input_report magno_input;
	struct hpd_input_report hpd_input;
	struct als_input_report als_input;
	struct hpd_status hpdstatus;
	u8 report_size = 0;

	if (!sensor_virt_addr || !input_report)
@@ -227,6 +252,13 @@ u8 get_input_report(u8 current_index, int sensor_idx, int report_id, struct amd_
		report_size = sizeof(als_input);
		memcpy(input_report, &als_input, sizeof(als_input));
		break;
	case HPD_IDX: /* hpd */
		get_common_inputs(&hpd_input.common_property, report_id);
		hpdstatus.val = readl(privdata->mmio + AMD_C2P_MSG(4));
		hpd_input.human_presence = hpdstatus.shpd.human_presence_actual;
		report_size = sizeof(hpd_input);
		memcpy(input_report, &hpd_input, sizeof(hpd_input));
		break;
	default:
		break;
	}
+10 −0
Original line number Diff line number Diff line
@@ -100,6 +100,16 @@ struct als_input_report {
	int illuminance_value;
} __packed;

struct hpd_feature_report {
	struct common_feature_property common_property;
} __packed;

struct hpd_input_report {
	struct common_input_property common_property;
	 /* values specific to human presence sensor */
	u8 human_presence;
} __packed;

int get_report_descriptor(int sensor_idx, u8 rep_desc[]);
u32 get_descr_sz(int sensor_idx, int descriptor_name);
u8 get_feature_report(int sensor_idx, int report_id, u8 *feature_report);
Loading