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

driver.h (3165B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * mux/driver.h - definitions for the multiplexer driver interface
      4 *
      5 * Copyright (C) 2017 Axentia Technologies AB
      6 *
      7 * Author: Peter Rosin <peda@axentia.se>
      8 */
      9
     10#ifndef _LINUX_MUX_DRIVER_H
     11#define _LINUX_MUX_DRIVER_H
     12
     13#include <dt-bindings/mux/mux.h>
     14#include <linux/device.h>
     15#include <linux/ktime.h>
     16#include <linux/semaphore.h>
     17
     18struct mux_chip;
     19struct mux_control;
     20
     21/**
     22 * struct mux_control_ops -	Mux controller operations for a mux chip.
     23 * @set:			Set the state of the given mux controller.
     24 */
     25struct mux_control_ops {
     26	int (*set)(struct mux_control *mux, int state);
     27};
     28
     29/**
     30 * struct mux_control -	Represents a mux controller.
     31 * @lock:		Protects the mux controller state.
     32 * @chip:		The mux chip that is handling this mux controller.
     33 * @cached_state:	The current mux controller state, or -1 if none.
     34 * @states:		The number of mux controller states.
     35 * @idle_state:		The mux controller state to use when inactive, or one
     36 *			of MUX_IDLE_AS_IS and MUX_IDLE_DISCONNECT.
     37 * @last_change:	Timestamp of last change
     38 *
     39 * Mux drivers may only change @states and @idle_state, and may only do so
     40 * between allocation and registration of the mux controller. Specifically,
     41 * @cached_state is internal to the mux core and should never be written by
     42 * mux drivers.
     43 */
     44struct mux_control {
     45	struct semaphore lock; /* protects the state of the mux */
     46
     47	struct mux_chip *chip;
     48	int cached_state;
     49
     50	unsigned int states;
     51	int idle_state;
     52
     53	ktime_t last_change;
     54};
     55
     56/**
     57 * struct mux_chip -	Represents a chip holding mux controllers.
     58 * @controllers:	Number of mux controllers handled by the chip.
     59 * @mux:		Array of mux controllers that are handled.
     60 * @dev:		Device structure.
     61 * @id:			Used to identify the device internally.
     62 * @ops:		Mux controller operations.
     63 */
     64struct mux_chip {
     65	unsigned int controllers;
     66	struct mux_control *mux;
     67	struct device dev;
     68	int id;
     69
     70	const struct mux_control_ops *ops;
     71};
     72
     73#define to_mux_chip(x) container_of((x), struct mux_chip, dev)
     74
     75/**
     76 * mux_chip_priv() - Get the extra memory reserved by mux_chip_alloc().
     77 * @mux_chip: The mux-chip to get the private memory from.
     78 *
     79 * Return: Pointer to the private memory reserved by the allocator.
     80 */
     81static inline void *mux_chip_priv(struct mux_chip *mux_chip)
     82{
     83	return &mux_chip->mux[mux_chip->controllers];
     84}
     85
     86struct mux_chip *mux_chip_alloc(struct device *dev,
     87				unsigned int controllers, size_t sizeof_priv);
     88int mux_chip_register(struct mux_chip *mux_chip);
     89void mux_chip_unregister(struct mux_chip *mux_chip);
     90void mux_chip_free(struct mux_chip *mux_chip);
     91
     92struct mux_chip *devm_mux_chip_alloc(struct device *dev,
     93				     unsigned int controllers,
     94				     size_t sizeof_priv);
     95int devm_mux_chip_register(struct device *dev, struct mux_chip *mux_chip);
     96
     97/**
     98 * mux_control_get_index() - Get the index of the given mux controller
     99 * @mux: The mux-control to get the index for.
    100 *
    101 * Return: The index of the mux controller within the mux chip the mux
    102 * controller is a part of.
    103 */
    104static inline unsigned int mux_control_get_index(struct mux_control *mux)
    105{
    106	return mux - mux->chip->mux;
    107}
    108
    109#endif /* _LINUX_MUX_DRIVER_H */