Lines Matching +full:chip +full:- +full:temperature +full:- +full:threshold +full:- +full:celsius
1 // SPDX-License-Identifier: GPL-2.0-only
3 * hdaps.c - driver for IBM's Hard Drive Active Protection System
9 * starting with the R40, T41, and X40. It provides a basic two-axis
10 * accelerometer and other data, such as the device's temperature.
31 #define HDAPS_NR_PORTS 0x30 /* number of ports: 0x1600 - 0x162f */
34 #define HDAPS_PORT_YPOS 0x1612 /* y-axis position */
35 #define HDAPS_PORT_XPOS 0x1614 /* x-axis position */
36 #define HDAPS_PORT_TEMP1 0x1616 /* device temperature, in Celsius */
37 #define HDAPS_PORT_YVAR 0x1617 /* y-axis variance (what is this?) */
38 #define HDAPS_PORT_XVAR 0x1619 /* x-axis variance (what is this?) */
39 #define HDAPS_PORT_TEMP2 0x161b /* device temperature (again?) */
54 #define HDAPS_INPUT_FUZZ 4 /* input event threshold */
71 * __get_latch - Get the value from a given port. Callers must hold hdaps_mtx.
79 * __check_latch - Check a port latch for a given value. Returns zero if the
86 return -EINVAL; in __check_latch()
90 * __wait_latch - Wait up to 100us for a port latch to get a certain value,
103 return -EIO; in __wait_latch()
107 * __device_refresh - request a refresh from the accelerometer. Does not wait
120 * __device_refresh_sync - request a synchronous refresh from the
131 * __device_complete - indicate to the accelerometer that we are done reading
142 * hdaps_readb_one - reads a byte from a single I/O port, placing the value in
152 /* do a sync refresh -- we need to be sure that we read fresh data */ in hdaps_readb_one()
165 /* __hdaps_read_pair - internal lockless helper for hdaps_read_pair(). */
169 /* do a sync refresh -- we need to be sure that we read fresh data */ in __hdaps_read_pair()
171 return -EIO; in __hdaps_read_pair()
180 *x = -*x; in __hdaps_read_pair()
182 *y = -*y; in __hdaps_read_pair()
188 * hdaps_read_pair - reads the values from a pair of ports, placing the values
204 * hdaps_device_init - initialize the accelerometer. Returns zero on success
209 int total, ret = -ENXIO; in hdaps_device_init()
221 * Others--namely the R50p, T41p, and T42p--return 0x03. These laptops in hdaps_device_init()
224 * The 0x02 value occurs when the chip has been previously initialized. in hdaps_device_init()
263 for (total = INIT_TIMEOUT_MSECS; total > 0; total -= INIT_WAIT_MSECS) { in hdaps_device_init()
314 * hdaps_calibrate - Set our "resting" values. Callers must hold hdaps_mtx.
330 input_report_abs(input_dev, ABS_X, x - rest_x); in hdaps_mousedev_poll()
331 input_report_abs(input_dev, ABS_Y, y - rest_y); in hdaps_mousedev_poll()
436 return -EINVAL; in hdaps_invert_store()
472 /* hdaps_dmi_match - found a match. return one, short-circuiting the hunt. */
475 pr_info("%s detected\n", id->ident); in hdaps_dmi_match()
479 /* hdaps_dmi_match_invert - found an inverted match. */
482 hdaps_invert = (unsigned long)id->driver_data; in hdaps_dmi_match_invert()
537 ret = -ENODEV; in hdaps_init()
542 ret = -ENXIO; in hdaps_init()
556 ret = sysfs_create_group(&pdev->dev.kobj, &hdaps_attribute_group); in hdaps_init()
562 ret = -ENOMEM; in hdaps_init()
570 hdaps_idev->name = "hdaps"; in hdaps_init()
571 hdaps_idev->phys = "isa1600/input0"; in hdaps_init()
572 hdaps_idev->id.bustype = BUS_ISA; in hdaps_init()
573 hdaps_idev->dev.parent = &pdev->dev; in hdaps_init()
575 -256, 256, HDAPS_INPUT_FUZZ, HDAPS_INPUT_FLAT); in hdaps_init()
577 -256, 256, HDAPS_INPUT_FUZZ, HDAPS_INPUT_FLAT); in hdaps_init()
595 sysfs_remove_group(&pdev->dev.kobj, &hdaps_attribute_group); in hdaps_init()
610 sysfs_remove_group(&pdev->dev.kobj, &hdaps_attribute_group); in hdaps_exit()
622 MODULE_PARM_DESC(invert, "invert data along each axis. 1 invert x-axis, "
623 "2 invert y-axis, 3 invert both axes.");