0001
0002
0003
0004
0005
0006
0007
0008
0009
0010 #include <linux/device.h>
0011 #include <linux/module.h>
0012
0013 #include <linux/mfd/lm3533.h>
0014
0015
0016 #define LM3533_MAX_CURRENT_MIN 5000
0017 #define LM3533_MAX_CURRENT_MAX 29800
0018 #define LM3533_MAX_CURRENT_STEP 800
0019
0020 #define LM3533_PWM_MAX 0x3f
0021
0022 #define LM3533_REG_PWM_BASE 0x14
0023 #define LM3533_REG_MAX_CURRENT_BASE 0x1f
0024 #define LM3533_REG_CTRLBANK_ENABLE 0x27
0025 #define LM3533_REG_BRIGHTNESS_BASE 0x40
0026
0027
0028 static inline u8 lm3533_ctrlbank_get_reg(struct lm3533_ctrlbank *cb, u8 base)
0029 {
0030 return base + cb->id;
0031 }
0032
0033 int lm3533_ctrlbank_enable(struct lm3533_ctrlbank *cb)
0034 {
0035 u8 mask;
0036 int ret;
0037
0038 dev_dbg(cb->dev, "%s - %d\n", __func__, cb->id);
0039
0040 mask = 1 << cb->id;
0041 ret = lm3533_update(cb->lm3533, LM3533_REG_CTRLBANK_ENABLE,
0042 mask, mask);
0043 if (ret)
0044 dev_err(cb->dev, "failed to enable ctrlbank %d\n", cb->id);
0045
0046 return ret;
0047 }
0048 EXPORT_SYMBOL_GPL(lm3533_ctrlbank_enable);
0049
0050 int lm3533_ctrlbank_disable(struct lm3533_ctrlbank *cb)
0051 {
0052 u8 mask;
0053 int ret;
0054
0055 dev_dbg(cb->dev, "%s - %d\n", __func__, cb->id);
0056
0057 mask = 1 << cb->id;
0058 ret = lm3533_update(cb->lm3533, LM3533_REG_CTRLBANK_ENABLE, 0, mask);
0059 if (ret)
0060 dev_err(cb->dev, "failed to disable ctrlbank %d\n", cb->id);
0061
0062 return ret;
0063 }
0064 EXPORT_SYMBOL_GPL(lm3533_ctrlbank_disable);
0065
0066
0067
0068
0069
0070
0071 int lm3533_ctrlbank_set_max_current(struct lm3533_ctrlbank *cb, u16 imax)
0072 {
0073 u8 reg;
0074 u8 val;
0075 int ret;
0076
0077 if (imax < LM3533_MAX_CURRENT_MIN || imax > LM3533_MAX_CURRENT_MAX)
0078 return -EINVAL;
0079
0080 val = (imax - LM3533_MAX_CURRENT_MIN) / LM3533_MAX_CURRENT_STEP;
0081
0082 reg = lm3533_ctrlbank_get_reg(cb, LM3533_REG_MAX_CURRENT_BASE);
0083 ret = lm3533_write(cb->lm3533, reg, val);
0084 if (ret)
0085 dev_err(cb->dev, "failed to set max current\n");
0086
0087 return ret;
0088 }
0089 EXPORT_SYMBOL_GPL(lm3533_ctrlbank_set_max_current);
0090
0091 int lm3533_ctrlbank_set_brightness(struct lm3533_ctrlbank *cb, u8 val)
0092 {
0093 u8 reg;
0094 int ret;
0095
0096 reg = lm3533_ctrlbank_get_reg(cb, LM3533_REG_BRIGHTNESS_BASE);
0097 ret = lm3533_write(cb->lm3533, reg, val);
0098 if (ret)
0099 dev_err(cb->dev, "failed to set brightness\n");
0100
0101 return ret;
0102 }
0103 EXPORT_SYMBOL_GPL(lm3533_ctrlbank_set_brightness);
0104
0105 int lm3533_ctrlbank_get_brightness(struct lm3533_ctrlbank *cb, u8 *val)
0106 {
0107 u8 reg;
0108 int ret;
0109
0110 reg = lm3533_ctrlbank_get_reg(cb, LM3533_REG_BRIGHTNESS_BASE);
0111 ret = lm3533_read(cb->lm3533, reg, val);
0112 if (ret)
0113 dev_err(cb->dev, "failed to get brightness\n");
0114
0115 return ret;
0116 }
0117 EXPORT_SYMBOL_GPL(lm3533_ctrlbank_get_brightness);
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127
0128
0129 int lm3533_ctrlbank_set_pwm(struct lm3533_ctrlbank *cb, u8 val)
0130 {
0131 u8 reg;
0132 int ret;
0133
0134 if (val > LM3533_PWM_MAX)
0135 return -EINVAL;
0136
0137 reg = lm3533_ctrlbank_get_reg(cb, LM3533_REG_PWM_BASE);
0138 ret = lm3533_write(cb->lm3533, reg, val);
0139 if (ret)
0140 dev_err(cb->dev, "failed to set PWM mask\n");
0141
0142 return ret;
0143 }
0144 EXPORT_SYMBOL_GPL(lm3533_ctrlbank_set_pwm);
0145
0146 int lm3533_ctrlbank_get_pwm(struct lm3533_ctrlbank *cb, u8 *val)
0147 {
0148 u8 reg;
0149 int ret;
0150
0151 reg = lm3533_ctrlbank_get_reg(cb, LM3533_REG_PWM_BASE);
0152 ret = lm3533_read(cb->lm3533, reg, val);
0153 if (ret)
0154 dev_err(cb->dev, "failed to get PWM mask\n");
0155
0156 return ret;
0157 }
0158 EXPORT_SYMBOL_GPL(lm3533_ctrlbank_get_pwm);
0159
0160 MODULE_AUTHOR("Johan Hovold <jhovold@gmail.com>");
0161 MODULE_DESCRIPTION("LM3533 Control Bank interface");
0162 MODULE_LICENSE("GPL");