leds-lp55xx: fix problem on removing LED attributes
[firefly-linux-kernel-4.4.55.git] / drivers / leds / leds-lp55xx-common.h
index 81753012ba273ca35a6fe53cb6acd4863bb2df35..ece4761a1302bbac7d6f522e7a57e890ba9f1ae3 100644 (file)
 #ifndef _LEDS_LP55XX_COMMON_H
 #define _LEDS_LP55XX_COMMON_H
 
+enum lp55xx_engine_index {
+       LP55XX_ENGINE_INVALID,
+       LP55XX_ENGINE_1,
+       LP55XX_ENGINE_2,
+       LP55XX_ENGINE_3,
+};
+
 struct lp55xx_led;
 struct lp55xx_chip;
 
@@ -32,10 +39,36 @@ struct lp55xx_reg {
  * struct lp55xx_device_config
  * @reset              : Chip specific reset command
  * @enable             : Chip specific enable command
+ * @max_channel        : Maximum number of channels
+ * @post_init_device   : Chip specific initialization code
+ * @brightness_work_fn : Brightness work function
+ * @set_led_current    : LED current set function
+ * @firmware_cb        : Call function when the firmware is loaded
+ * @run_engine         : Run internal engine for pattern
+ * @dev_attr_group     : Device specific attributes
  */
 struct lp55xx_device_config {
        const struct lp55xx_reg reset;
        const struct lp55xx_reg enable;
+       const int max_channel;
+
+       /* define if the device has specific initialization process */
+       int (*post_init_device) (struct lp55xx_chip *chip);
+
+       /* access brightness register */
+       void (*brightness_work_fn)(struct work_struct *work);
+
+       /* current setting function */
+       void (*set_led_current) (struct lp55xx_led *led, u8 led_current);
+
+       /* 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);
+
+       /* additional device specific attributes */
+       const struct attribute_group *dev_attr_group;
 };
 
 /*
@@ -45,6 +78,8 @@ struct lp55xx_device_config {
  * @lock       : Lock for user-space interface
  * @num_leds   : Number of registered LEDs
  * @cfg        : Device specific configuration data
+ * @engine_idx : Selected engine number
+ * @fw         : Firmware data for running a LED pattern
  */
 struct lp55xx_chip {
        struct i2c_client *cl;
@@ -52,6 +87,8 @@ struct lp55xx_chip {
        struct mutex lock;      /* lock for user-space interface */
        int num_leds;
        struct lp55xx_device_config *cfg;
+       enum lp55xx_engine_index engine_idx;
+       const struct firmware *fw;
 };
 
 /*
@@ -80,7 +117,18 @@ 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);
 
-/* common device init functions */
+/* common device init/deinit functions */
 extern int lp55xx_init_device(struct lp55xx_chip *chip);
+extern void lp55xx_deinit_device(struct lp55xx_chip *chip);
+
+/* common LED class device functions */
+extern int lp55xx_register_leds(struct lp55xx_led *led,
+                               struct lp55xx_chip *chip);
+extern void lp55xx_unregister_leds(struct lp55xx_led *led,
+                               struct lp55xx_chip *chip);
+
+/* common device attributes functions */
+extern int lp55xx_register_sysfs(struct lp55xx_chip *chip);
+extern void lp55xx_unregister_sysfs(struct lp55xx_chip *chip);
 
 #endif /* _LEDS_LP55XX_COMMON_H */