cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

rmi_f01.c (19308B)


      1// SPDX-License-Identifier: GPL-2.0-only
      2/*
      3 * Copyright (c) 2011-2016 Synaptics Incorporated
      4 * Copyright (c) 2011 Unixphere
      5 */
      6
      7#include <linux/kernel.h>
      8#include <linux/rmi.h>
      9#include <linux/slab.h>
     10#include <linux/uaccess.h>
     11#include <linux/of.h>
     12#include <asm/unaligned.h>
     13#include "rmi_driver.h"
     14
     15#define RMI_PRODUCT_ID_LENGTH    10
     16#define RMI_PRODUCT_INFO_LENGTH   2
     17
     18#define RMI_DATE_CODE_LENGTH      3
     19
     20#define PRODUCT_ID_OFFSET 0x10
     21#define PRODUCT_INFO_OFFSET 0x1E
     22
     23
     24/* Force a firmware reset of the sensor */
     25#define RMI_F01_CMD_DEVICE_RESET	1
     26
     27/* Various F01_RMI_QueryX bits */
     28
     29#define RMI_F01_QRY1_CUSTOM_MAP		BIT(0)
     30#define RMI_F01_QRY1_NON_COMPLIANT	BIT(1)
     31#define RMI_F01_QRY1_HAS_LTS		BIT(2)
     32#define RMI_F01_QRY1_HAS_SENSOR_ID	BIT(3)
     33#define RMI_F01_QRY1_HAS_CHARGER_INP	BIT(4)
     34#define RMI_F01_QRY1_HAS_ADJ_DOZE	BIT(5)
     35#define RMI_F01_QRY1_HAS_ADJ_DOZE_HOFF	BIT(6)
     36#define RMI_F01_QRY1_HAS_QUERY42	BIT(7)
     37
     38#define RMI_F01_QRY5_YEAR_MASK		0x1f
     39#define RMI_F01_QRY6_MONTH_MASK		0x0f
     40#define RMI_F01_QRY7_DAY_MASK		0x1f
     41
     42#define RMI_F01_QRY2_PRODINFO_MASK	0x7f
     43
     44#define RMI_F01_BASIC_QUERY_LEN		21 /* From Query 00 through 20 */
     45
     46struct f01_basic_properties {
     47	u8 manufacturer_id;
     48	bool has_lts;
     49	bool has_adjustable_doze;
     50	bool has_adjustable_doze_holdoff;
     51	char dom[11]; /* YYYY/MM/DD + '\0' */
     52	u8 product_id[RMI_PRODUCT_ID_LENGTH + 1];
     53	u16 productinfo;
     54	u32 firmware_id;
     55	u32 package_id;
     56};
     57
     58/* F01 device status bits */
     59
     60/* Most recent device status event */
     61#define RMI_F01_STATUS_CODE(status)		((status) & 0x0f)
     62/* The device has lost its configuration for some reason. */
     63#define RMI_F01_STATUS_UNCONFIGURED(status)	(!!((status) & 0x80))
     64/* The device is in bootloader mode */
     65#define RMI_F01_STATUS_BOOTLOADER(status)	((status) & 0x40)
     66
     67/* Control register bits */
     68
     69/*
     70 * Sleep mode controls power management on the device and affects all
     71 * functions of the device.
     72 */
     73#define RMI_F01_CTRL0_SLEEP_MODE_MASK	0x03
     74
     75#define RMI_SLEEP_MODE_NORMAL		0x00
     76#define RMI_SLEEP_MODE_SENSOR_SLEEP	0x01
     77#define RMI_SLEEP_MODE_RESERVED0	0x02
     78#define RMI_SLEEP_MODE_RESERVED1	0x03
     79
     80/*
     81 * This bit disables whatever sleep mode may be selected by the sleep_mode
     82 * field and forces the device to run at full power without sleeping.
     83 */
     84#define RMI_F01_CTRL0_NOSLEEP_BIT	BIT(2)
     85
     86/*
     87 * When this bit is set, the touch controller employs a noise-filtering
     88 * algorithm designed for use with a connected battery charger.
     89 */
     90#define RMI_F01_CTRL0_CHARGER_BIT	BIT(5)
     91
     92/*
     93 * Sets the report rate for the device. The effect of this setting is
     94 * highly product dependent. Check the spec sheet for your particular
     95 * touch sensor.
     96 */
     97#define RMI_F01_CTRL0_REPORTRATE_BIT	BIT(6)
     98
     99/*
    100 * Written by the host as an indicator that the device has been
    101 * successfully configured.
    102 */
    103#define RMI_F01_CTRL0_CONFIGURED_BIT	BIT(7)
    104
    105/**
    106 * struct f01_device_control - controls basic sensor functions
    107 *
    108 * @ctrl0: see the bit definitions above.
    109 * @doze_interval: controls the interval between checks for finger presence
    110 *	when the touch sensor is in doze mode, in units of 10ms.
    111 * @wakeup_threshold: controls the capacitance threshold at which the touch
    112 *	sensor will decide to wake up from that low power state.
    113 * @doze_holdoff: controls how long the touch sensor waits after the last
    114 *	finger lifts before entering the doze state, in units of 100ms.
    115 */
    116struct f01_device_control {
    117	u8 ctrl0;
    118	u8 doze_interval;
    119	u8 wakeup_threshold;
    120	u8 doze_holdoff;
    121};
    122
    123struct f01_data {
    124	struct f01_basic_properties properties;
    125	struct f01_device_control device_control;
    126
    127	u16 doze_interval_addr;
    128	u16 wakeup_threshold_addr;
    129	u16 doze_holdoff_addr;
    130
    131	bool suspended;
    132	bool old_nosleep;
    133
    134	unsigned int num_of_irq_regs;
    135};
    136
    137static int rmi_f01_read_properties(struct rmi_device *rmi_dev,
    138				   u16 query_base_addr,
    139				   struct f01_basic_properties *props)
    140{
    141	u8 queries[RMI_F01_BASIC_QUERY_LEN];
    142	int ret;
    143	int query_offset = query_base_addr;
    144	bool has_ds4_queries = false;
    145	bool has_query42 = false;
    146	bool has_sensor_id = false;
    147	bool has_package_id_query = false;
    148	bool has_build_id_query = false;
    149	u16 prod_info_addr;
    150	u8 ds4_query_len;
    151
    152	ret = rmi_read_block(rmi_dev, query_offset,
    153			       queries, RMI_F01_BASIC_QUERY_LEN);
    154	if (ret) {
    155		dev_err(&rmi_dev->dev,
    156			"Failed to read device query registers: %d\n", ret);
    157		return ret;
    158	}
    159
    160	prod_info_addr = query_offset + 17;
    161	query_offset += RMI_F01_BASIC_QUERY_LEN;
    162
    163	/* Now parse what we got */
    164	props->manufacturer_id = queries[0];
    165
    166	props->has_lts = queries[1] & RMI_F01_QRY1_HAS_LTS;
    167	props->has_adjustable_doze =
    168			queries[1] & RMI_F01_QRY1_HAS_ADJ_DOZE;
    169	props->has_adjustable_doze_holdoff =
    170			queries[1] & RMI_F01_QRY1_HAS_ADJ_DOZE_HOFF;
    171	has_query42 = queries[1] & RMI_F01_QRY1_HAS_QUERY42;
    172	has_sensor_id = queries[1] & RMI_F01_QRY1_HAS_SENSOR_ID;
    173
    174	snprintf(props->dom, sizeof(props->dom), "20%02d/%02d/%02d",
    175		 queries[5] & RMI_F01_QRY5_YEAR_MASK,
    176		 queries[6] & RMI_F01_QRY6_MONTH_MASK,
    177		 queries[7] & RMI_F01_QRY7_DAY_MASK);
    178
    179	memcpy(props->product_id, &queries[11],
    180		RMI_PRODUCT_ID_LENGTH);
    181	props->product_id[RMI_PRODUCT_ID_LENGTH] = '\0';
    182
    183	props->productinfo =
    184			((queries[2] & RMI_F01_QRY2_PRODINFO_MASK) << 7) |
    185			(queries[3] & RMI_F01_QRY2_PRODINFO_MASK);
    186
    187	if (has_sensor_id)
    188		query_offset++;
    189
    190	if (has_query42) {
    191		ret = rmi_read(rmi_dev, query_offset, queries);
    192		if (ret) {
    193			dev_err(&rmi_dev->dev,
    194				"Failed to read query 42 register: %d\n", ret);
    195			return ret;
    196		}
    197
    198		has_ds4_queries = !!(queries[0] & BIT(0));
    199		query_offset++;
    200	}
    201
    202	if (has_ds4_queries) {
    203		ret = rmi_read(rmi_dev, query_offset, &ds4_query_len);
    204		if (ret) {
    205			dev_err(&rmi_dev->dev,
    206				"Failed to read DS4 queries length: %d\n", ret);
    207			return ret;
    208		}
    209		query_offset++;
    210
    211		if (ds4_query_len > 0) {
    212			ret = rmi_read(rmi_dev, query_offset, queries);
    213			if (ret) {
    214				dev_err(&rmi_dev->dev,
    215					"Failed to read DS4 queries: %d\n",
    216					ret);
    217				return ret;
    218			}
    219
    220			has_package_id_query = !!(queries[0] & BIT(0));
    221			has_build_id_query = !!(queries[0] & BIT(1));
    222		}
    223
    224		if (has_package_id_query) {
    225			ret = rmi_read_block(rmi_dev, prod_info_addr,
    226					     queries, sizeof(__le64));
    227			if (ret) {
    228				dev_err(&rmi_dev->dev,
    229					"Failed to read package info: %d\n",
    230					ret);
    231				return ret;
    232			}
    233
    234			props->package_id = get_unaligned_le64(queries);
    235			prod_info_addr++;
    236		}
    237
    238		if (has_build_id_query) {
    239			ret = rmi_read_block(rmi_dev, prod_info_addr, queries,
    240					    3);
    241			if (ret) {
    242				dev_err(&rmi_dev->dev,
    243					"Failed to read product info: %d\n",
    244					ret);
    245				return ret;
    246			}
    247
    248			props->firmware_id = queries[1] << 8 | queries[0];
    249			props->firmware_id += queries[2] * 65536;
    250		}
    251	}
    252
    253	return 0;
    254}
    255
    256const char *rmi_f01_get_product_ID(struct rmi_function *fn)
    257{
    258	struct f01_data *f01 = dev_get_drvdata(&fn->dev);
    259
    260	return f01->properties.product_id;
    261}
    262
    263static ssize_t rmi_driver_manufacturer_id_show(struct device *dev,
    264					       struct device_attribute *dattr,
    265					       char *buf)
    266{
    267	struct rmi_driver_data *data = dev_get_drvdata(dev);
    268	struct f01_data *f01 = dev_get_drvdata(&data->f01_container->dev);
    269
    270	return scnprintf(buf, PAGE_SIZE, "%d\n",
    271			 f01->properties.manufacturer_id);
    272}
    273
    274static DEVICE_ATTR(manufacturer_id, 0444,
    275		   rmi_driver_manufacturer_id_show, NULL);
    276
    277static ssize_t rmi_driver_dom_show(struct device *dev,
    278				   struct device_attribute *dattr, char *buf)
    279{
    280	struct rmi_driver_data *data = dev_get_drvdata(dev);
    281	struct f01_data *f01 = dev_get_drvdata(&data->f01_container->dev);
    282
    283	return scnprintf(buf, PAGE_SIZE, "%s\n", f01->properties.dom);
    284}
    285
    286static DEVICE_ATTR(date_of_manufacture, 0444, rmi_driver_dom_show, NULL);
    287
    288static ssize_t rmi_driver_product_id_show(struct device *dev,
    289					  struct device_attribute *dattr,
    290					  char *buf)
    291{
    292	struct rmi_driver_data *data = dev_get_drvdata(dev);
    293	struct f01_data *f01 = dev_get_drvdata(&data->f01_container->dev);
    294
    295	return scnprintf(buf, PAGE_SIZE, "%s\n", f01->properties.product_id);
    296}
    297
    298static DEVICE_ATTR(product_id, 0444, rmi_driver_product_id_show, NULL);
    299
    300static ssize_t rmi_driver_firmware_id_show(struct device *dev,
    301					   struct device_attribute *dattr,
    302					   char *buf)
    303{
    304	struct rmi_driver_data *data = dev_get_drvdata(dev);
    305	struct f01_data *f01 = dev_get_drvdata(&data->f01_container->dev);
    306
    307	return scnprintf(buf, PAGE_SIZE, "%d\n", f01->properties.firmware_id);
    308}
    309
    310static DEVICE_ATTR(firmware_id, 0444, rmi_driver_firmware_id_show, NULL);
    311
    312static ssize_t rmi_driver_package_id_show(struct device *dev,
    313					  struct device_attribute *dattr,
    314					  char *buf)
    315{
    316	struct rmi_driver_data *data = dev_get_drvdata(dev);
    317	struct f01_data *f01 = dev_get_drvdata(&data->f01_container->dev);
    318
    319	u32 package_id = f01->properties.package_id;
    320
    321	return scnprintf(buf, PAGE_SIZE, "%04x.%04x\n",
    322			 package_id & 0xffff, (package_id >> 16) & 0xffff);
    323}
    324
    325static DEVICE_ATTR(package_id, 0444, rmi_driver_package_id_show, NULL);
    326
    327static struct attribute *rmi_f01_attrs[] = {
    328	&dev_attr_manufacturer_id.attr,
    329	&dev_attr_date_of_manufacture.attr,
    330	&dev_attr_product_id.attr,
    331	&dev_attr_firmware_id.attr,
    332	&dev_attr_package_id.attr,
    333	NULL
    334};
    335
    336static const struct attribute_group rmi_f01_attr_group = {
    337	.attrs = rmi_f01_attrs,
    338};
    339
    340#ifdef CONFIG_OF
    341static int rmi_f01_of_probe(struct device *dev,
    342				struct rmi_device_platform_data *pdata)
    343{
    344	int retval;
    345	u32 val;
    346
    347	retval = rmi_of_property_read_u32(dev,
    348			(u32 *)&pdata->power_management.nosleep,
    349			"syna,nosleep-mode", 1);
    350	if (retval)
    351		return retval;
    352
    353	retval = rmi_of_property_read_u32(dev, &val,
    354			"syna,wakeup-threshold", 1);
    355	if (retval)
    356		return retval;
    357
    358	pdata->power_management.wakeup_threshold = val;
    359
    360	retval = rmi_of_property_read_u32(dev, &val,
    361			"syna,doze-holdoff-ms", 1);
    362	if (retval)
    363		return retval;
    364
    365	pdata->power_management.doze_holdoff = val * 100;
    366
    367	retval = rmi_of_property_read_u32(dev, &val,
    368			"syna,doze-interval-ms", 1);
    369	if (retval)
    370		return retval;
    371
    372	pdata->power_management.doze_interval = val / 10;
    373
    374	return 0;
    375}
    376#else
    377static inline int rmi_f01_of_probe(struct device *dev,
    378					struct rmi_device_platform_data *pdata)
    379{
    380	return -ENODEV;
    381}
    382#endif
    383
    384static int rmi_f01_probe(struct rmi_function *fn)
    385{
    386	struct rmi_device *rmi_dev = fn->rmi_dev;
    387	struct rmi_driver_data *driver_data = dev_get_drvdata(&rmi_dev->dev);
    388	struct rmi_device_platform_data *pdata = rmi_get_platform_data(rmi_dev);
    389	struct f01_data *f01;
    390	int error;
    391	u16 ctrl_base_addr = fn->fd.control_base_addr;
    392	u8 device_status;
    393	u8 temp;
    394
    395	if (fn->dev.of_node) {
    396		error = rmi_f01_of_probe(&fn->dev, pdata);
    397		if (error)
    398			return error;
    399	}
    400
    401	f01 = devm_kzalloc(&fn->dev, sizeof(struct f01_data), GFP_KERNEL);
    402	if (!f01)
    403		return -ENOMEM;
    404
    405	f01->num_of_irq_regs = driver_data->num_of_irq_regs;
    406
    407	/*
    408	 * Set the configured bit and (optionally) other important stuff
    409	 * in the device control register.
    410	 */
    411
    412	error = rmi_read(rmi_dev, fn->fd.control_base_addr,
    413			 &f01->device_control.ctrl0);
    414	if (error) {
    415		dev_err(&fn->dev, "Failed to read F01 control: %d\n", error);
    416		return error;
    417	}
    418
    419	switch (pdata->power_management.nosleep) {
    420	case RMI_REG_STATE_DEFAULT:
    421		break;
    422	case RMI_REG_STATE_OFF:
    423		f01->device_control.ctrl0 &= ~RMI_F01_CTRL0_NOSLEEP_BIT;
    424		break;
    425	case RMI_REG_STATE_ON:
    426		f01->device_control.ctrl0 |= RMI_F01_CTRL0_NOSLEEP_BIT;
    427		break;
    428	}
    429
    430	/*
    431	 * Sleep mode might be set as a hangover from a system crash or
    432	 * reboot without power cycle.  If so, clear it so the sensor
    433	 * is certain to function.
    434	 */
    435	if ((f01->device_control.ctrl0 & RMI_F01_CTRL0_SLEEP_MODE_MASK) !=
    436			RMI_SLEEP_MODE_NORMAL) {
    437		dev_warn(&fn->dev,
    438			 "WARNING: Non-zero sleep mode found. Clearing...\n");
    439		f01->device_control.ctrl0 &= ~RMI_F01_CTRL0_SLEEP_MODE_MASK;
    440	}
    441
    442	f01->device_control.ctrl0 |= RMI_F01_CTRL0_CONFIGURED_BIT;
    443
    444	error = rmi_write(rmi_dev, fn->fd.control_base_addr,
    445			  f01->device_control.ctrl0);
    446	if (error) {
    447		dev_err(&fn->dev, "Failed to write F01 control: %d\n", error);
    448		return error;
    449	}
    450
    451	/* Dummy read in order to clear irqs */
    452	error = rmi_read(rmi_dev, fn->fd.data_base_addr + 1, &temp);
    453	if (error < 0) {
    454		dev_err(&fn->dev, "Failed to read Interrupt Status.\n");
    455		return error;
    456	}
    457
    458	error = rmi_f01_read_properties(rmi_dev, fn->fd.query_base_addr,
    459					&f01->properties);
    460	if (error < 0) {
    461		dev_err(&fn->dev, "Failed to read F01 properties.\n");
    462		return error;
    463	}
    464
    465	dev_info(&fn->dev, "found RMI device, manufacturer: %s, product: %s, fw id: %d\n",
    466		 f01->properties.manufacturer_id == 1 ? "Synaptics" : "unknown",
    467		 f01->properties.product_id, f01->properties.firmware_id);
    468
    469	/* Advance to interrupt control registers, then skip over them. */
    470	ctrl_base_addr++;
    471	ctrl_base_addr += f01->num_of_irq_regs;
    472
    473	/* read control register */
    474	if (f01->properties.has_adjustable_doze) {
    475		f01->doze_interval_addr = ctrl_base_addr;
    476		ctrl_base_addr++;
    477
    478		if (pdata->power_management.doze_interval) {
    479			f01->device_control.doze_interval =
    480				pdata->power_management.doze_interval;
    481			error = rmi_write(rmi_dev, f01->doze_interval_addr,
    482					  f01->device_control.doze_interval);
    483			if (error) {
    484				dev_err(&fn->dev,
    485					"Failed to configure F01 doze interval register: %d\n",
    486					error);
    487				return error;
    488			}
    489		} else {
    490			error = rmi_read(rmi_dev, f01->doze_interval_addr,
    491					 &f01->device_control.doze_interval);
    492			if (error) {
    493				dev_err(&fn->dev,
    494					"Failed to read F01 doze interval register: %d\n",
    495					error);
    496				return error;
    497			}
    498		}
    499
    500		f01->wakeup_threshold_addr = ctrl_base_addr;
    501		ctrl_base_addr++;
    502
    503		if (pdata->power_management.wakeup_threshold) {
    504			f01->device_control.wakeup_threshold =
    505				pdata->power_management.wakeup_threshold;
    506			error = rmi_write(rmi_dev, f01->wakeup_threshold_addr,
    507					  f01->device_control.wakeup_threshold);
    508			if (error) {
    509				dev_err(&fn->dev,
    510					"Failed to configure F01 wakeup threshold register: %d\n",
    511					error);
    512				return error;
    513			}
    514		} else {
    515			error = rmi_read(rmi_dev, f01->wakeup_threshold_addr,
    516					 &f01->device_control.wakeup_threshold);
    517			if (error < 0) {
    518				dev_err(&fn->dev,
    519					"Failed to read F01 wakeup threshold register: %d\n",
    520					error);
    521				return error;
    522			}
    523		}
    524	}
    525
    526	if (f01->properties.has_lts)
    527		ctrl_base_addr++;
    528
    529	if (f01->properties.has_adjustable_doze_holdoff) {
    530		f01->doze_holdoff_addr = ctrl_base_addr;
    531		ctrl_base_addr++;
    532
    533		if (pdata->power_management.doze_holdoff) {
    534			f01->device_control.doze_holdoff =
    535				pdata->power_management.doze_holdoff;
    536			error = rmi_write(rmi_dev, f01->doze_holdoff_addr,
    537					  f01->device_control.doze_holdoff);
    538			if (error) {
    539				dev_err(&fn->dev,
    540					"Failed to configure F01 doze holdoff register: %d\n",
    541					error);
    542				return error;
    543			}
    544		} else {
    545			error = rmi_read(rmi_dev, f01->doze_holdoff_addr,
    546					 &f01->device_control.doze_holdoff);
    547			if (error) {
    548				dev_err(&fn->dev,
    549					"Failed to read F01 doze holdoff register: %d\n",
    550					error);
    551				return error;
    552			}
    553		}
    554	}
    555
    556	error = rmi_read(rmi_dev, fn->fd.data_base_addr, &device_status);
    557	if (error < 0) {
    558		dev_err(&fn->dev,
    559			"Failed to read device status: %d\n", error);
    560		return error;
    561	}
    562
    563	if (RMI_F01_STATUS_UNCONFIGURED(device_status)) {
    564		dev_err(&fn->dev,
    565			"Device was reset during configuration process, status: %#02x!\n",
    566			RMI_F01_STATUS_CODE(device_status));
    567		return -EINVAL;
    568	}
    569
    570	dev_set_drvdata(&fn->dev, f01);
    571
    572	error = sysfs_create_group(&fn->rmi_dev->dev.kobj, &rmi_f01_attr_group);
    573	if (error)
    574		dev_warn(&fn->dev, "Failed to create sysfs group: %d\n", error);
    575
    576	return 0;
    577}
    578
    579static void rmi_f01_remove(struct rmi_function *fn)
    580{
    581	/* Note that the bus device is used, not the F01 device */
    582	sysfs_remove_group(&fn->rmi_dev->dev.kobj, &rmi_f01_attr_group);
    583}
    584
    585static int rmi_f01_config(struct rmi_function *fn)
    586{
    587	struct f01_data *f01 = dev_get_drvdata(&fn->dev);
    588	int error;
    589
    590	error = rmi_write(fn->rmi_dev, fn->fd.control_base_addr,
    591			  f01->device_control.ctrl0);
    592	if (error) {
    593		dev_err(&fn->dev,
    594			"Failed to write device_control register: %d\n", error);
    595		return error;
    596	}
    597
    598	if (f01->properties.has_adjustable_doze) {
    599		error = rmi_write(fn->rmi_dev, f01->doze_interval_addr,
    600				  f01->device_control.doze_interval);
    601		if (error) {
    602			dev_err(&fn->dev,
    603				"Failed to write doze interval: %d\n", error);
    604			return error;
    605		}
    606
    607		error = rmi_write_block(fn->rmi_dev,
    608					 f01->wakeup_threshold_addr,
    609					 &f01->device_control.wakeup_threshold,
    610					 sizeof(u8));
    611		if (error) {
    612			dev_err(&fn->dev,
    613				"Failed to write wakeup threshold: %d\n",
    614				error);
    615			return error;
    616		}
    617	}
    618
    619	if (f01->properties.has_adjustable_doze_holdoff) {
    620		error = rmi_write(fn->rmi_dev, f01->doze_holdoff_addr,
    621				  f01->device_control.doze_holdoff);
    622		if (error) {
    623			dev_err(&fn->dev,
    624				"Failed to write doze holdoff: %d\n", error);
    625			return error;
    626		}
    627	}
    628
    629	return 0;
    630}
    631
    632static int rmi_f01_suspend(struct rmi_function *fn)
    633{
    634	struct f01_data *f01 = dev_get_drvdata(&fn->dev);
    635	int error;
    636
    637	f01->old_nosleep =
    638		f01->device_control.ctrl0 & RMI_F01_CTRL0_NOSLEEP_BIT;
    639	f01->device_control.ctrl0 &= ~RMI_F01_CTRL0_NOSLEEP_BIT;
    640
    641	f01->device_control.ctrl0 &= ~RMI_F01_CTRL0_SLEEP_MODE_MASK;
    642	if (device_may_wakeup(fn->rmi_dev->xport->dev))
    643		f01->device_control.ctrl0 |= RMI_SLEEP_MODE_RESERVED1;
    644	else
    645		f01->device_control.ctrl0 |= RMI_SLEEP_MODE_SENSOR_SLEEP;
    646
    647	error = rmi_write(fn->rmi_dev, fn->fd.control_base_addr,
    648			  f01->device_control.ctrl0);
    649	if (error) {
    650		dev_err(&fn->dev, "Failed to write sleep mode: %d.\n", error);
    651		if (f01->old_nosleep)
    652			f01->device_control.ctrl0 |= RMI_F01_CTRL0_NOSLEEP_BIT;
    653		f01->device_control.ctrl0 &= ~RMI_F01_CTRL0_SLEEP_MODE_MASK;
    654		f01->device_control.ctrl0 |= RMI_SLEEP_MODE_NORMAL;
    655		return error;
    656	}
    657
    658	return 0;
    659}
    660
    661static int rmi_f01_resume(struct rmi_function *fn)
    662{
    663	struct f01_data *f01 = dev_get_drvdata(&fn->dev);
    664	int error;
    665
    666	if (f01->old_nosleep)
    667		f01->device_control.ctrl0 |= RMI_F01_CTRL0_NOSLEEP_BIT;
    668
    669	f01->device_control.ctrl0 &= ~RMI_F01_CTRL0_SLEEP_MODE_MASK;
    670	f01->device_control.ctrl0 |= RMI_SLEEP_MODE_NORMAL;
    671
    672	error = rmi_write(fn->rmi_dev, fn->fd.control_base_addr,
    673			  f01->device_control.ctrl0);
    674	if (error) {
    675		dev_err(&fn->dev,
    676			"Failed to restore normal operation: %d.\n", error);
    677		return error;
    678	}
    679
    680	return 0;
    681}
    682
    683static irqreturn_t rmi_f01_attention(int irq, void *ctx)
    684{
    685	struct rmi_function *fn = ctx;
    686	struct rmi_device *rmi_dev = fn->rmi_dev;
    687	int error;
    688	u8 device_status;
    689
    690	error = rmi_read(rmi_dev, fn->fd.data_base_addr, &device_status);
    691	if (error) {
    692		dev_err(&fn->dev,
    693			"Failed to read device status: %d.\n", error);
    694		return IRQ_RETVAL(error);
    695	}
    696
    697	if (RMI_F01_STATUS_BOOTLOADER(device_status))
    698		dev_warn(&fn->dev,
    699			 "Device in bootloader mode, please update firmware\n");
    700
    701	if (RMI_F01_STATUS_UNCONFIGURED(device_status)) {
    702		dev_warn(&fn->dev, "Device reset detected.\n");
    703		error = rmi_dev->driver->reset_handler(rmi_dev);
    704		if (error) {
    705			dev_err(&fn->dev, "Device reset failed: %d\n", error);
    706			return IRQ_RETVAL(error);
    707		}
    708	}
    709
    710	return IRQ_HANDLED;
    711}
    712
    713struct rmi_function_handler rmi_f01_handler = {
    714	.driver = {
    715		.name	= "rmi4_f01",
    716		/*
    717		 * Do not allow user unbinding F01 as it is critical
    718		 * function.
    719		 */
    720		.suppress_bind_attrs = true,
    721	},
    722	.func		= 0x01,
    723	.probe		= rmi_f01_probe,
    724	.remove		= rmi_f01_remove,
    725	.config		= rmi_f01_config,
    726	.attention	= rmi_f01_attention,
    727	.suspend	= rmi_f01_suspend,
    728	.resume		= rmi_f01_resume,
    729};