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

ipaq-micro.h (3750B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * Header file for the compaq Micro MFD
      4 */
      5
      6#ifndef _MFD_IPAQ_MICRO_H_
      7#define _MFD_IPAQ_MICRO_H_
      8
      9#include <linux/spinlock.h>
     10#include <linux/completion.h>
     11#include <linux/list.h>
     12
     13#define TX_BUF_SIZE	32
     14#define RX_BUF_SIZE	16
     15#define CHAR_SOF	0x02
     16
     17/*
     18 * These are the different messages that can be sent to the microcontroller
     19 * to control various aspects.
     20 */
     21#define MSG_VERSION		0x0
     22#define MSG_KEYBOARD		0x2
     23#define MSG_TOUCHSCREEN		0x3
     24#define MSG_EEPROM_READ		0x4
     25#define MSG_EEPROM_WRITE	0x5
     26#define MSG_THERMAL_SENSOR	0x6
     27#define MSG_NOTIFY_LED		0x8
     28#define MSG_BATTERY		0x9
     29#define MSG_SPI_READ		0xb
     30#define MSG_SPI_WRITE		0xc
     31#define MSG_BACKLIGHT		0xd /* H3600 only */
     32#define MSG_CODEC_CTRL		0xe /* H3100 only */
     33#define MSG_DISPLAY_CTRL	0xf /* H3100 only */
     34
     35/* state of receiver parser */
     36enum rx_state {
     37	STATE_SOF = 0,     /* Next byte should be start of frame */
     38	STATE_ID,          /* Next byte is ID & message length   */
     39	STATE_DATA,        /* Next byte is a data byte           */
     40	STATE_CHKSUM       /* Next byte should be checksum       */
     41};
     42
     43/**
     44 * struct ipaq_micro_txdev - TX state
     45 * @len: length of message in TX buffer
     46 * @index: current index into TX buffer
     47 * @buf: TX buffer
     48 */
     49struct ipaq_micro_txdev {
     50	u8 len;
     51	u8 index;
     52	u8 buf[TX_BUF_SIZE];
     53};
     54
     55/**
     56 * struct ipaq_micro_rxdev - RX state
     57 * @state: context of RX state machine
     58 * @chksum: calculated checksum
     59 * @id: message ID from packet
     60 * @len: RX buffer length
     61 * @index: RX buffer index
     62 * @buf: RX buffer
     63 */
     64struct ipaq_micro_rxdev {
     65	enum rx_state state;
     66	unsigned char chksum;
     67	u8            id;
     68	unsigned int  len;
     69	unsigned int  index;
     70	u8            buf[RX_BUF_SIZE];
     71};
     72
     73/**
     74 * struct ipaq_micro_msg - message to the iPAQ microcontroller
     75 * @id: 4-bit ID of the message
     76 * @tx_len: length of TX data
     77 * @tx_data: TX data to send
     78 * @rx_len: length of receieved RX data
     79 * @rx_data: RX data to recieve
     80 * @ack: a completion that will be completed when RX is complete
     81 * @node: list node if message gets queued
     82 */
     83struct ipaq_micro_msg {
     84	u8 id;
     85	u8 tx_len;
     86	u8 tx_data[TX_BUF_SIZE];
     87	u8 rx_len;
     88	u8 rx_data[RX_BUF_SIZE];
     89	struct completion ack;
     90	struct list_head node;
     91};
     92
     93/**
     94 * struct ipaq_micro - iPAQ microcontroller state
     95 * @dev: corresponding platform device
     96 * @base: virtual memory base for underlying serial device
     97 * @sdlc: virtual memory base for Synchronous Data Link Controller
     98 * @version: version string
     99 * @tx: TX state
    100 * @rx: RX state
    101 * @lock: lock for this state container
    102 * @msg: current message
    103 * @queue: message queue
    104 * @key: callback for asynchronous key events
    105 * @key_data: data to pass along with key events
    106 * @ts: callback for asynchronous touchscreen events
    107 * @ts_data: data to pass along with key events
    108 */
    109struct ipaq_micro {
    110	struct device *dev;
    111	void __iomem *base;
    112	void __iomem *sdlc;
    113	char version[5];
    114	struct ipaq_micro_txdev tx;	/* transmit ISR state */
    115	struct ipaq_micro_rxdev rx;	/* receive ISR state */
    116	spinlock_t lock;
    117	struct ipaq_micro_msg *msg;
    118	struct list_head queue;
    119	void (*key) (void *data, int len, unsigned char *rxdata);
    120	void *key_data;
    121	void (*ts) (void *data, int len, unsigned char *rxdata);
    122	void *ts_data;
    123};
    124
    125extern int
    126ipaq_micro_tx_msg(struct ipaq_micro *micro, struct ipaq_micro_msg *msg);
    127
    128static inline int
    129ipaq_micro_tx_msg_sync(struct ipaq_micro *micro,
    130		       struct ipaq_micro_msg *msg)
    131{
    132	int ret;
    133
    134	init_completion(&msg->ack);
    135	ret = ipaq_micro_tx_msg(micro, msg);
    136	wait_for_completion(&msg->ack);
    137
    138	return ret;
    139}
    140
    141static inline int
    142ipaq_micro_tx_msg_async(struct ipaq_micro *micro,
    143			struct ipaq_micro_msg *msg)
    144{
    145	init_completion(&msg->ack);
    146	return ipaq_micro_tx_msg(micro, msg);
    147}
    148
    149#endif /* _MFD_IPAQ_MICRO_H_ */