linux/drivers/input/rmi4/rmi_driver.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-only */
   2/*
   3 * Copyright (c) 2011-2016 Synaptics Incorporated
   4 * Copyright (c) 2011 Unixphere
   5 */
   6
   7#ifndef _RMI_DRIVER_H
   8#define _RMI_DRIVER_H
   9
  10#include <linux/ctype.h>
  11#include <linux/hrtimer.h>
  12#include <linux/ktime.h>
  13#include <linux/input.h>
  14#include "rmi_bus.h"
  15
  16#define SYNAPTICS_INPUT_DEVICE_NAME "Synaptics RMI4 Touch Sensor"
  17#define SYNAPTICS_VENDOR_ID 0x06cb
  18
  19#define GROUP(_attrs) { \
  20        .attrs = _attrs,  \
  21}
  22
  23#define PDT_PROPERTIES_LOCATION 0x00EF
  24#define BSR_LOCATION 0x00FE
  25
  26#define RMI_PDT_PROPS_HAS_BSR 0x02
  27
  28#define NAME_BUFFER_SIZE 256
  29
  30#define RMI_PDT_ENTRY_SIZE 6
  31#define RMI_PDT_FUNCTION_VERSION_MASK   0x60
  32#define RMI_PDT_INT_SOURCE_COUNT_MASK   0x07
  33
  34#define PDT_START_SCAN_LOCATION 0x00e9
  35#define PDT_END_SCAN_LOCATION   0x0005
  36#define RMI4_END_OF_PDT(id) ((id) == 0x00 || (id) == 0xff)
  37
  38struct pdt_entry {
  39        u16 page_start;
  40        u8 query_base_addr;
  41        u8 command_base_addr;
  42        u8 control_base_addr;
  43        u8 data_base_addr;
  44        u8 interrupt_source_count;
  45        u8 function_version;
  46        u8 function_number;
  47};
  48
  49#define RMI_REG_DESC_PRESENSE_BITS      (32 * BITS_PER_BYTE)
  50#define RMI_REG_DESC_SUBPACKET_BITS     (37 * BITS_PER_BYTE)
  51
  52/* describes a single packet register */
  53struct rmi_register_desc_item {
  54        u16 reg;
  55        unsigned long reg_size;
  56        u8 num_subpackets;
  57        unsigned long subpacket_map[BITS_TO_LONGS(
  58                                RMI_REG_DESC_SUBPACKET_BITS)];
  59};
  60
  61/*
  62 * describes the packet registers for a particular type
  63 * (ie query, control, data)
  64 */
  65struct rmi_register_descriptor {
  66        unsigned long struct_size;
  67        unsigned long presense_map[BITS_TO_LONGS(RMI_REG_DESC_PRESENSE_BITS)];
  68        u8 num_registers;
  69        struct rmi_register_desc_item *registers;
  70};
  71
  72int rmi_read_register_desc(struct rmi_device *d, u16 addr,
  73                                struct rmi_register_descriptor *rdesc);
  74const struct rmi_register_desc_item *rmi_get_register_desc_item(
  75                                struct rmi_register_descriptor *rdesc, u16 reg);
  76
  77/*
  78 * Calculate the total size of all of the registers described in the
  79 * descriptor.
  80 */
  81size_t rmi_register_desc_calc_size(struct rmi_register_descriptor *rdesc);
  82int rmi_register_desc_calc_reg_offset(
  83                        struct rmi_register_descriptor *rdesc, u16 reg);
  84bool rmi_register_desc_has_subpacket(const struct rmi_register_desc_item *item,
  85                        u8 subpacket);
  86
  87bool rmi_is_physical_driver(struct device_driver *);
  88int rmi_register_physical_driver(void);
  89void rmi_unregister_physical_driver(void);
  90void rmi_free_function_list(struct rmi_device *rmi_dev);
  91struct rmi_function *rmi_find_function(struct rmi_device *rmi_dev, u8 number);
  92int rmi_enable_sensor(struct rmi_device *rmi_dev);
  93int rmi_scan_pdt(struct rmi_device *rmi_dev, void *ctx,
  94                 int (*callback)(struct rmi_device *rmi_dev, void *ctx,
  95                 const struct pdt_entry *entry));
  96int rmi_probe_interrupts(struct rmi_driver_data *data);
  97void rmi_enable_irq(struct rmi_device *rmi_dev, bool clear_wake);
  98void rmi_disable_irq(struct rmi_device *rmi_dev, bool enable_wake);
  99int rmi_init_functions(struct rmi_driver_data *data);
 100int rmi_initial_reset(struct rmi_device *rmi_dev, void *ctx,
 101                      const struct pdt_entry *pdt);
 102
 103const char *rmi_f01_get_product_ID(struct rmi_function *fn);
 104
 105#ifdef CONFIG_RMI4_F03
 106int rmi_f03_overwrite_button(struct rmi_function *fn, unsigned int button,
 107                             int value);
 108void rmi_f03_commit_buttons(struct rmi_function *fn);
 109#else
 110static inline int rmi_f03_overwrite_button(struct rmi_function *fn,
 111                                           unsigned int button, int value)
 112{
 113        return 0;
 114}
 115static inline void rmi_f03_commit_buttons(struct rmi_function *fn) {}
 116#endif
 117
 118#ifdef CONFIG_RMI4_F34
 119int rmi_f34_create_sysfs(struct rmi_device *rmi_dev);
 120void rmi_f34_remove_sysfs(struct rmi_device *rmi_dev);
 121#else
 122static inline int rmi_f34_create_sysfs(struct rmi_device *rmi_dev)
 123{
 124        return 0;
 125}
 126
 127static inline void rmi_f34_remove_sysfs(struct rmi_device *rmi_dev)
 128{
 129}
 130#endif /* CONFIG_RMI_F34 */
 131
 132extern struct rmi_function_handler rmi_f01_handler;
 133extern struct rmi_function_handler rmi_f03_handler;
 134extern struct rmi_function_handler rmi_f11_handler;
 135extern struct rmi_function_handler rmi_f12_handler;
 136extern struct rmi_function_handler rmi_f30_handler;
 137extern struct rmi_function_handler rmi_f34_handler;
 138extern struct rmi_function_handler rmi_f54_handler;
 139extern struct rmi_function_handler rmi_f55_handler;
 140#endif
 141