2019-06-04 11:11:33 +03:00
/* SPDX-License-Identifier: GPL-2.0-only */
2013-02-05 13:01:23 +04:00
/*
* LP55XX Common Driver Header
*
* Copyright ( C ) 2012 Texas Instruments
*
* Author : Milo ( Woogyom ) Kim < milo . kim @ ti . com >
*
* Derived from leds - lp5521 . c , leds - lp5523 . c
*/
# ifndef _LEDS_LP55XX_COMMON_H
# define _LEDS_LP55XX_COMMON_H
2020-07-16 21:20:01 +03:00
# include <linux/led-class-multicolor.h>
2013-02-05 14:17:20 +04:00
enum lp55xx_engine_index {
LP55XX_ENGINE_INVALID ,
LP55XX_ENGINE_1 ,
LP55XX_ENGINE_2 ,
LP55XX_ENGINE_3 ,
2013-08-08 07:45:41 +04:00
LP55XX_ENGINE_MAX = LP55XX_ENGINE_3 ,
} ;
enum lp55xx_engine_mode {
LP55XX_ENGINE_DISABLED ,
LP55XX_ENGINE_LOAD ,
LP55XX_ENGINE_RUN ,
2013-02-05 14:17:20 +04:00
} ;
2013-08-08 07:46:43 +04:00
# define LP55XX_DEV_ATTR_RW(name, show, store) \
DEVICE_ATTR ( name , S_IRUGO | S_IWUSR , show , store )
# define LP55XX_DEV_ATTR_RO(name, show) \
DEVICE_ATTR ( name , S_IRUGO , show , NULL )
# define LP55XX_DEV_ATTR_WO(name, store) \
DEVICE_ATTR ( name , S_IWUSR , NULL , store )
# define show_mode(nr) \
static ssize_t show_engine # # nr # # _mode ( struct device * dev , \
struct device_attribute * attr , \
char * buf ) \
{ \
return show_engine_mode ( dev , attr , buf , nr ) ; \
}
# define store_mode(nr) \
static ssize_t store_engine # # nr # # _mode ( struct device * dev , \
struct device_attribute * attr , \
const char * buf , size_t len ) \
{ \
return store_engine_mode ( dev , attr , buf , len , nr ) ; \
}
# define show_leds(nr) \
static ssize_t show_engine # # nr # # _leds ( struct device * dev , \
struct device_attribute * attr , \
char * buf ) \
{ \
return show_engine_leds ( dev , attr , buf , nr ) ; \
}
# define store_leds(nr) \
static ssize_t store_engine # # nr # # _leds ( struct device * dev , \
struct device_attribute * attr , \
const char * buf , size_t len ) \
{ \
return store_engine_leds ( dev , attr , buf , len , nr ) ; \
}
# define store_load(nr) \
static ssize_t store_engine # # nr # # _load ( struct device * dev , \
struct device_attribute * attr , \
const char * buf , size_t len ) \
{ \
return store_engine_load ( dev , attr , buf , len , nr ) ; \
}
2013-02-05 13:01:23 +04:00
struct lp55xx_led ;
struct lp55xx_chip ;
2013-02-05 13:08:49 +04:00
/*
* struct lp55xx_reg
* @ addr : Register address
* @ val : Register value
*/
struct lp55xx_reg {
u8 addr ;
u8 val ;
} ;
/*
* struct lp55xx_device_config
* @ reset : Chip specific reset command
2013-02-05 13:09:56 +04:00
* @ enable : Chip specific enable command
2013-02-05 14:07:34 +04:00
* @ max_channel : Maximum number of channels
2013-02-05 13:57:36 +04:00
* @ post_init_device : Chip specific initialization code
2015-08-20 13:22:57 +03:00
* @ brightness_fn : Brightness function
2020-07-16 21:20:01 +03:00
* @ multicolor_brightness_fn : Multicolor brightness function
2013-02-05 14:06:27 +04:00
* @ set_led_current : LED current set function
2013-02-05 14:17:20 +04:00
* @ firmware_cb : Call function when the firmware is loaded
* @ run_engine : Run internal engine for pattern
2013-02-05 14:20:01 +04:00
* @ dev_attr_group : Device specific attributes
2013-02-05 13:08:49 +04:00
*/
struct lp55xx_device_config {
const struct lp55xx_reg reset ;
2013-02-05 13:09:56 +04:00
const struct lp55xx_reg enable ;
2013-02-05 14:07:34 +04:00
const int max_channel ;
2013-02-05 13:57:36 +04:00
/* define if the device has specific initialization process */
int ( * post_init_device ) ( struct lp55xx_chip * chip ) ;
2013-02-05 14:06:27 +04:00
2020-07-16 21:20:01 +03:00
/* set LED brightness */
2015-08-20 13:22:57 +03:00
int ( * brightness_fn ) ( struct lp55xx_led * led ) ;
2013-02-05 14:06:27 +04:00
2020-07-16 21:20:01 +03:00
/* set multicolor LED brightness */
int ( * multicolor_brightness_fn ) ( struct lp55xx_led * led ) ;
2013-02-05 14:06:27 +04:00
/* current setting function */
void ( * set_led_current ) ( struct lp55xx_led * led , u8 led_current ) ;
2013-02-05 14:17:20 +04:00
/* access program memory when the firmware is loaded */
void ( * firmware_cb ) ( struct lp55xx_chip * chip ) ;
/* used for running firmware LED patterns */
void ( * run_engine ) ( struct lp55xx_chip * chip , bool start ) ;
2013-02-05 14:20:01 +04:00
/* additional device specific attributes */
const struct attribute_group * dev_attr_group ;
2013-02-05 13:08:49 +04:00
} ;
2013-08-08 07:45:41 +04:00
/*
* struct lp55xx_engine
* @ mode : Engine mode
* @ led_mux : Mux bits for LED selection . Only used in LP5523
*/
struct lp55xx_engine {
enum lp55xx_engine_mode mode ;
u16 led_mux ;
} ;
2013-02-05 13:01:23 +04:00
/*
* struct lp55xx_chip
* @ cl : I2C communication for access registers
* @ pdata : Platform specific data
* @ lock : Lock for user - space interface
* @ num_leds : Number of registered LEDs
2013-02-05 13:08:49 +04:00
* @ cfg : Device specific configuration data
2013-02-05 14:17:20 +04:00
* @ engine_idx : Selected engine number
2013-08-08 07:45:41 +04:00
* @ engines : Engine structure for the device attribute R / W interface
2013-02-05 14:17:20 +04:00
* @ fw : Firmware data for running a LED pattern
2013-02-05 13:01:23 +04:00
*/
struct lp55xx_chip {
struct i2c_client * cl ;
2013-03-21 04:37:00 +04:00
struct clk * clk ;
2013-02-05 13:01:23 +04:00
struct lp55xx_platform_data * pdata ;
struct mutex lock ; /* lock for user-space interface */
int num_leds ;
2013-02-05 13:08:49 +04:00
struct lp55xx_device_config * cfg ;
2013-02-05 14:17:20 +04:00
enum lp55xx_engine_index engine_idx ;
2013-08-08 07:45:41 +04:00
struct lp55xx_engine engines [ LP55XX_ENGINE_MAX ] ;
2013-02-05 14:17:20 +04:00
const struct firmware * fw ;
2013-02-05 13:01:23 +04:00
} ;
/*
* struct lp55xx_led
* @ chan_nr : Channel number
* @ cdev : LED class device
2020-07-16 21:20:01 +03:00
* @ mc_cdev : Multi color class device
* @ color_components : Multi color LED map information
2013-02-05 13:01:23 +04:00
* @ led_current : Current setting at each led channel
* @ max_current : Maximun current at each led channel
* @ brightness : Brightness value
* @ chip : The lp55xx chip data
*/
struct lp55xx_led {
int chan_nr ;
struct led_classdev cdev ;
2020-07-16 21:20:01 +03:00
struct led_classdev_mc mc_cdev ;
2013-02-05 13:01:23 +04:00
u8 led_current ;
u8 max_current ;
u8 brightness ;
struct lp55xx_chip * chip ;
} ;
/* register access */
extern int lp55xx_write ( struct lp55xx_chip * chip , u8 reg , u8 val ) ;
extern int lp55xx_read ( struct lp55xx_chip * chip , u8 reg , u8 * val ) ;
extern int lp55xx_update_bits ( struct lp55xx_chip * chip , u8 reg ,
u8 mask , u8 val ) ;
2013-03-21 04:37:00 +04:00
/* external clock detection */
extern bool lp55xx_is_extclk_used ( struct lp55xx_chip * chip ) ;
2013-02-05 14:03:02 +04:00
/* common device init/deinit functions */
2013-02-05 13:07:20 +04:00
extern int lp55xx_init_device ( struct lp55xx_chip * chip ) ;
2013-02-05 14:03:02 +04:00
extern void lp55xx_deinit_device ( struct lp55xx_chip * chip ) ;
2013-02-05 13:07:20 +04:00
2013-02-05 14:06:27 +04:00
/* common LED class device functions */
extern int lp55xx_register_leds ( struct lp55xx_led * led ,
struct lp55xx_chip * chip ) ;
2013-02-05 14:15:27 +04:00
/* common device attributes functions */
extern int lp55xx_register_sysfs ( struct lp55xx_chip * chip ) ;
2013-02-05 14:23:04 +04:00
extern void lp55xx_unregister_sysfs ( struct lp55xx_chip * chip ) ;
2013-02-05 14:15:27 +04:00
2013-04-23 15:52:59 +04:00
/* common device tree population function */
2015-08-24 10:09:55 +03:00
extern struct lp55xx_platform_data
2020-07-16 21:20:01 +03:00
* lp55xx_of_populate_pdata ( struct device * dev , struct device_node * np ,
struct lp55xx_chip * chip ) ;
2013-04-23 15:52:59 +04:00
2013-02-05 13:01:23 +04:00
# endif /* _LEDS_LP55XX_COMMON_H */