/* * leds-ir-rt8547.h - Flash-led driver for RT8547 * * Copyright (C) 2011 Samsung Electronics * Sunggeun Yim * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. */ #ifndef __LEDS_RT8547_H__ #define __LEDS_RT8547_H__ #include #include #include #include #define rt8547_NAME "leds-rt8547" #define RT8547_FLASH_CURRENT(mA) (((mA)-100)/50) #define RT8547_MOVIE_CURRENT(mA) (((mA)-25)/25) #define LED_ERROR(x, ...) printk(KERN_ERR "%s : " x, __func__, ##__VA_ARGS__) #define LED_INFO(x, ...) printk(KERN_INFO "%s : " x, __func__, ##__VA_ARGS__) #define LED_CHECK_ERR_GOTO(x, out, fmt, ...) \ if (unlikely((x) < 0)) { \ printk(KERN_ERR fmt, ##__VA_ARGS__); \ goto out; \ } #define DT_READ_U32(node, key, value) do {\ pprop = key; \ temp = 0; \ if (of_property_read_u32((node), key, &temp)) \ pr_warn("%s: no property in the node.\n", pprop);\ (value) = temp; \ } while (0) #define RT8547_ADDR_LVP_SETTING 0x1 #define RT8547_ADDR_FLASH_CURRENT_LEVEL_TIMEOUT_SETTING 0x2 #define RT8547_ADDR_CURRENT_SETTING 0x3 #define RT8547_ADDR_FLASH_TIMEOUT_SETTING 0x4 #define RT8547_SLAVE_ADDR 0x99 #define RT8547_SW_RESET 0x20 #define RT8547_TORCH_SELECT 0x10 #define RT8547_STROBE_SELECT 0x0f #define T_SHORT 4 /* us */ #define T_LONG 60 /* us*/ #define T_SOD 10 /* us */ #define T_EOD 10 /* us */ /* LVP_SETTING */ enum rt8547_LVPsetting_t { RT8547_3V = 0x0, RT8547_3_1V, RT8547_3_2V, RT8547_3_3V, RT8547_3_4V, RT8547_3_5V, RT8547_3_6V, RT8547_3_7V, RT8547_3_8V, RT8547_MAX = 0xf, }; /* FLASH_TIMEOUT_SETTING */ enum rt8547_timer_t { RT8547_TIMER_64ms = 0x00, RT8547_TIMER_96ms, RT8547_TIMER_512ms = 0x0e, RT8547_TIMER_544ms, RT8547_TIMER_704ms = 0x14, RT8547_TIMER_992ms = 0x1d, RT8547_TIMER_1024ms, RT8547_TIMER_1088ms = 0x20, RT8547_TIMER_1120ms, RT8547_TIMER_1152ms, RT8547_TIMER_1184ms, RT8547_TIMER_1216ms, RT8547_TIMER_MAX = 0x3f, }; /* MIN. CURRENT SETTING FOR TIMER OPERATING */ enum rt8547_timeout_current_t { RT8547_TIMEOUT_CURRENT_100mA = 0x0, RT8547_TIMEOUT_CURRENT_150mA, RT8547_TIMEOUT_CURRENT_200mA, RT8547_TIMEOUT_CURRENT_250mA, RT8547_TIMEOUT_CURRENT_300mA, RT8547_TIMEOUT_CURRENT_350mA, RT8547_TIMEOUT_CURRENT_400mA = 0x7, }; /* MOVIE CURRENT SETTING */ enum rt8547_movie_current_t { RT8547_MOVIE_CURRENT_25mA = 0x0, RT8547_MOVIE_CURRENT_50mA, RT8547_MOVIE_CURRENT_75mA, RT8547_MOVIE_CURRENT_100mA, RT8547_MOVIE_CURRENT_125mA, RT8547_MOVIE_CURRENT_150mA, RT8547_MOVIE_CURRENT_175mA, RT8547_MOVIE_CURRENT_200mA, RT8547_MOVIE_CURRENT_225mA, RT8547_MOVIE_CURRENT_250mA, RT8547_MOVIE_CURRENT_275mA, RT8547_MOVIE_CURRENT_300mA, RT8547_MOVIE_CURRENT_325mA, RT8547_MOVIE_CURRENT_350mA, RT8547_MOVIE_CURRENT_375mA, RT8547_MOVIE_CURRENT_400mA, }; /* FLASH CURRENT SETTING */ enum rt8547_flash_current_t { RT8547_FLASH_CURRENT_100mA = 0x00, RT8547_FLASH_CURRENT_150mA, RT8547_FLASH_CURRENT_200mA, RT8547_FLASH_CURRENT_250mA, RT8547_FLASH_CURRENT_900mA = 0x10, RT8547_FLASH_CURRENT_950mA, RT8547_FLASH_CURRENT_1000mA, RT8547_FLASH_CURRENT_1200mA = 0x16, RT8547_FLASH_CURRENT_1250mA, RT8547_FLASH_CURRENT_1300mA, RT8547_FLASH_CURRENT_1350mA, RT8547_FLASH_CURRENT_1400mA, RT8547_FLASH_CURRENT_1450mA, RT8547_FLASH_CURRENT_1500mA, RT8547_FLASH_CURRENT_1550mA, RT8547_FLASH_CURRENT_1600mA, RT8547_FLASH_CURRENT_MAX = 0x1f, }; /* MOVIE/FLASH MODE CONTROL */ enum rt8547_mode_control_t { RT8547_DISABLES_MOVIE_FLASH_MODE = 0x0, RT8547_ENABLE_MOVIE_MODE, RT8547_ENABLE_FLASH_MODE, RT8547_ENABLE_PRE_FLASH_MODE, }; struct rt8547_platform_data { spinlock_t int_lock; int sysfs_input_data; int flash_control; int flash_en; struct workqueue_struct *wqueue; enum rt8547_LVPsetting_t LVP_Voltage; enum rt8547_timer_t flash_timeout; enum rt8547_timeout_current_t timeout_current_value; enum rt8547_flash_current_t flash_current_value; enum rt8547_movie_current_t movie_current_value; enum rt8547_movie_current_t factory_current_value; enum rt8547_movie_current_t pre_current_value; enum rt8547_mode_control_t mode_status; }; extern int32_t rt8547_led_mode_ctrl(int state); #endif