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

leds-lp55xx-common.h (6121B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * LP55XX Common Driver Header
      4 *
      5 * Copyright (C) 2012 Texas Instruments
      6 *
      7 * Author: Milo(Woogyom) Kim <milo.kim@ti.com>
      8 *
      9 * Derived from leds-lp5521.c, leds-lp5523.c
     10 */
     11
     12#ifndef _LEDS_LP55XX_COMMON_H
     13#define _LEDS_LP55XX_COMMON_H
     14
     15#include <linux/led-class-multicolor.h>
     16
     17enum lp55xx_engine_index {
     18	LP55XX_ENGINE_INVALID,
     19	LP55XX_ENGINE_1,
     20	LP55XX_ENGINE_2,
     21	LP55XX_ENGINE_3,
     22	LP55XX_ENGINE_MAX = LP55XX_ENGINE_3,
     23};
     24
     25enum lp55xx_engine_mode {
     26	LP55XX_ENGINE_DISABLED,
     27	LP55XX_ENGINE_LOAD,
     28	LP55XX_ENGINE_RUN,
     29};
     30
     31#define LP55XX_DEV_ATTR_RW(name, show, store)	\
     32	DEVICE_ATTR(name, S_IRUGO | S_IWUSR, show, store)
     33#define LP55XX_DEV_ATTR_RO(name, show)		\
     34	DEVICE_ATTR(name, S_IRUGO, show, NULL)
     35#define LP55XX_DEV_ATTR_WO(name, store)		\
     36	DEVICE_ATTR(name, S_IWUSR, NULL, store)
     37
     38#define show_mode(nr)							\
     39static ssize_t show_engine##nr##_mode(struct device *dev,		\
     40				    struct device_attribute *attr,	\
     41				    char *buf)				\
     42{									\
     43	return show_engine_mode(dev, attr, buf, nr);			\
     44}
     45
     46#define store_mode(nr)							\
     47static ssize_t store_engine##nr##_mode(struct device *dev,		\
     48				     struct device_attribute *attr,	\
     49				     const char *buf, size_t len)	\
     50{									\
     51	return store_engine_mode(dev, attr, buf, len, nr);		\
     52}
     53
     54#define show_leds(nr)							\
     55static ssize_t show_engine##nr##_leds(struct device *dev,		\
     56			    struct device_attribute *attr,		\
     57			    char *buf)					\
     58{									\
     59	return show_engine_leds(dev, attr, buf, nr);			\
     60}
     61
     62#define store_leds(nr)						\
     63static ssize_t store_engine##nr##_leds(struct device *dev,	\
     64			     struct device_attribute *attr,	\
     65			     const char *buf, size_t len)	\
     66{								\
     67	return store_engine_leds(dev, attr, buf, len, nr);	\
     68}
     69
     70#define store_load(nr)							\
     71static ssize_t store_engine##nr##_load(struct device *dev,		\
     72				     struct device_attribute *attr,	\
     73				     const char *buf, size_t len)	\
     74{									\
     75	return store_engine_load(dev, attr, buf, len, nr);		\
     76}
     77
     78struct lp55xx_led;
     79struct lp55xx_chip;
     80
     81/*
     82 * struct lp55xx_reg
     83 * @addr : Register address
     84 * @val  : Register value
     85 */
     86struct lp55xx_reg {
     87	u8 addr;
     88	u8 val;
     89};
     90
     91/*
     92 * struct lp55xx_device_config
     93 * @reset              : Chip specific reset command
     94 * @enable             : Chip specific enable command
     95 * @max_channel        : Maximum number of channels
     96 * @post_init_device   : Chip specific initialization code
     97 * @brightness_fn      : Brightness function
     98 * @multicolor_brightness_fn : Multicolor brightness function
     99 * @set_led_current    : LED current set function
    100 * @firmware_cb        : Call function when the firmware is loaded
    101 * @run_engine         : Run internal engine for pattern
    102 * @dev_attr_group     : Device specific attributes
    103 */
    104struct lp55xx_device_config {
    105	const struct lp55xx_reg reset;
    106	const struct lp55xx_reg enable;
    107	const int max_channel;
    108
    109	/* define if the device has specific initialization process */
    110	int (*post_init_device) (struct lp55xx_chip *chip);
    111
    112	/* set LED brightness */
    113	int (*brightness_fn)(struct lp55xx_led *led);
    114
    115	/* set multicolor LED brightness */
    116	int (*multicolor_brightness_fn)(struct lp55xx_led *led);
    117
    118	/* current setting function */
    119	void (*set_led_current) (struct lp55xx_led *led, u8 led_current);
    120
    121	/* access program memory when the firmware is loaded */
    122	void (*firmware_cb)(struct lp55xx_chip *chip);
    123
    124	/* used for running firmware LED patterns */
    125	void (*run_engine) (struct lp55xx_chip *chip, bool start);
    126
    127	/* additional device specific attributes */
    128	const struct attribute_group *dev_attr_group;
    129};
    130
    131/*
    132 * struct lp55xx_engine
    133 * @mode       : Engine mode
    134 * @led_mux    : Mux bits for LED selection. Only used in LP5523
    135 */
    136struct lp55xx_engine {
    137	enum lp55xx_engine_mode mode;
    138	u16 led_mux;
    139};
    140
    141/*
    142 * struct lp55xx_chip
    143 * @cl         : I2C communication for access registers
    144 * @pdata      : Platform specific data
    145 * @lock       : Lock for user-space interface
    146 * @num_leds   : Number of registered LEDs
    147 * @cfg        : Device specific configuration data
    148 * @engine_idx : Selected engine number
    149 * @engines    : Engine structure for the device attribute R/W interface
    150 * @fw         : Firmware data for running a LED pattern
    151 */
    152struct lp55xx_chip {
    153	struct i2c_client *cl;
    154	struct clk *clk;
    155	struct lp55xx_platform_data *pdata;
    156	struct mutex lock;	/* lock for user-space interface */
    157	int num_leds;
    158	struct lp55xx_device_config *cfg;
    159	enum lp55xx_engine_index engine_idx;
    160	struct lp55xx_engine engines[LP55XX_ENGINE_MAX];
    161	const struct firmware *fw;
    162};
    163
    164/*
    165 * struct lp55xx_led
    166 * @chan_nr         : Channel number
    167 * @cdev            : LED class device
    168 * @mc_cdev         : Multi color class device
    169 * @color_components: Multi color LED map information
    170 * @led_current     : Current setting at each led channel
    171 * @max_current     : Maximun current at each led channel
    172 * @brightness      : Brightness value
    173 * @chip            : The lp55xx chip data
    174 */
    175struct lp55xx_led {
    176	int chan_nr;
    177	struct led_classdev cdev;
    178	struct led_classdev_mc mc_cdev;
    179	u8 led_current;
    180	u8 max_current;
    181	u8 brightness;
    182	struct lp55xx_chip *chip;
    183};
    184
    185/* register access */
    186extern int lp55xx_write(struct lp55xx_chip *chip, u8 reg, u8 val);
    187extern int lp55xx_read(struct lp55xx_chip *chip, u8 reg, u8 *val);
    188extern int lp55xx_update_bits(struct lp55xx_chip *chip, u8 reg,
    189			u8 mask, u8 val);
    190
    191/* external clock detection */
    192extern bool lp55xx_is_extclk_used(struct lp55xx_chip *chip);
    193
    194/* common device init/deinit functions */
    195extern int lp55xx_init_device(struct lp55xx_chip *chip);
    196extern void lp55xx_deinit_device(struct lp55xx_chip *chip);
    197
    198/* common LED class device functions */
    199extern int lp55xx_register_leds(struct lp55xx_led *led,
    200				struct lp55xx_chip *chip);
    201
    202/* common device attributes functions */
    203extern int lp55xx_register_sysfs(struct lp55xx_chip *chip);
    204extern void lp55xx_unregister_sysfs(struct lp55xx_chip *chip);
    205
    206/* common device tree population function */
    207extern struct lp55xx_platform_data
    208*lp55xx_of_populate_pdata(struct device *dev, struct device_node *np,
    209			  struct lp55xx_chip *chip);
    210
    211#endif /* _LEDS_LP55XX_COMMON_H */