163 lines · c
1// SPDX-License-Identifier: GPL-2.0-or-later2/*3 * lm3533-ctrlbank.c -- LM3533 Generic Control Bank interface4 *5 * Copyright (C) 2011-2012 Texas Instruments6 *7 * Author: Johan Hovold <jhovold@gmail.com>8 */9 10#include <linux/device.h>11#include <linux/module.h>12 13#include <linux/mfd/lm3533.h>14 15 16#define LM3533_MAX_CURRENT_MIN 500017#define LM3533_MAX_CURRENT_MAX 2980018#define LM3533_MAX_CURRENT_STEP 80019 20#define LM3533_PWM_MAX 0x3f21 22#define LM3533_REG_PWM_BASE 0x1423#define LM3533_REG_MAX_CURRENT_BASE 0x1f24#define LM3533_REG_CTRLBANK_ENABLE 0x2725#define LM3533_REG_BRIGHTNESS_BASE 0x4026 27 28static inline u8 lm3533_ctrlbank_get_reg(struct lm3533_ctrlbank *cb, u8 base)29{30 return base + cb->id;31}32 33int lm3533_ctrlbank_enable(struct lm3533_ctrlbank *cb)34{35 u8 mask;36 int ret;37 38 dev_dbg(cb->dev, "%s - %d\n", __func__, cb->id);39 40 mask = 1 << cb->id;41 ret = lm3533_update(cb->lm3533, LM3533_REG_CTRLBANK_ENABLE,42 mask, mask);43 if (ret)44 dev_err(cb->dev, "failed to enable ctrlbank %d\n", cb->id);45 46 return ret;47}48EXPORT_SYMBOL_GPL(lm3533_ctrlbank_enable);49 50int lm3533_ctrlbank_disable(struct lm3533_ctrlbank *cb)51{52 u8 mask;53 int ret;54 55 dev_dbg(cb->dev, "%s - %d\n", __func__, cb->id);56 57 mask = 1 << cb->id;58 ret = lm3533_update(cb->lm3533, LM3533_REG_CTRLBANK_ENABLE, 0, mask);59 if (ret)60 dev_err(cb->dev, "failed to disable ctrlbank %d\n", cb->id);61 62 return ret;63}64EXPORT_SYMBOL_GPL(lm3533_ctrlbank_disable);65 66/*67 * Full-scale current.68 *69 * imax 5000 - 29800 uA (800 uA step)70 */71int lm3533_ctrlbank_set_max_current(struct lm3533_ctrlbank *cb, u16 imax)72{73 u8 reg;74 u8 val;75 int ret;76 77 if (imax < LM3533_MAX_CURRENT_MIN || imax > LM3533_MAX_CURRENT_MAX)78 return -EINVAL;79 80 val = (imax - LM3533_MAX_CURRENT_MIN) / LM3533_MAX_CURRENT_STEP;81 82 reg = lm3533_ctrlbank_get_reg(cb, LM3533_REG_MAX_CURRENT_BASE);83 ret = lm3533_write(cb->lm3533, reg, val);84 if (ret)85 dev_err(cb->dev, "failed to set max current\n");86 87 return ret;88}89EXPORT_SYMBOL_GPL(lm3533_ctrlbank_set_max_current);90 91int lm3533_ctrlbank_set_brightness(struct lm3533_ctrlbank *cb, u8 val)92{93 u8 reg;94 int ret;95 96 reg = lm3533_ctrlbank_get_reg(cb, LM3533_REG_BRIGHTNESS_BASE);97 ret = lm3533_write(cb->lm3533, reg, val);98 if (ret)99 dev_err(cb->dev, "failed to set brightness\n");100 101 return ret;102}103EXPORT_SYMBOL_GPL(lm3533_ctrlbank_set_brightness);104 105int lm3533_ctrlbank_get_brightness(struct lm3533_ctrlbank *cb, u8 *val)106{107 u8 reg;108 int ret;109 110 reg = lm3533_ctrlbank_get_reg(cb, LM3533_REG_BRIGHTNESS_BASE);111 ret = lm3533_read(cb->lm3533, reg, val);112 if (ret)113 dev_err(cb->dev, "failed to get brightness\n");114 115 return ret;116}117EXPORT_SYMBOL_GPL(lm3533_ctrlbank_get_brightness);118 119/*120 * PWM-input control mask:121 *122 * bit 5 - PWM-input enabled in Zone 4123 * bit 4 - PWM-input enabled in Zone 3124 * bit 3 - PWM-input enabled in Zone 2125 * bit 2 - PWM-input enabled in Zone 1126 * bit 1 - PWM-input enabled in Zone 0127 * bit 0 - PWM-input enabled128 */129int lm3533_ctrlbank_set_pwm(struct lm3533_ctrlbank *cb, u8 val)130{131 u8 reg;132 int ret;133 134 if (val > LM3533_PWM_MAX)135 return -EINVAL;136 137 reg = lm3533_ctrlbank_get_reg(cb, LM3533_REG_PWM_BASE);138 ret = lm3533_write(cb->lm3533, reg, val);139 if (ret)140 dev_err(cb->dev, "failed to set PWM mask\n");141 142 return ret;143}144EXPORT_SYMBOL_GPL(lm3533_ctrlbank_set_pwm);145 146int lm3533_ctrlbank_get_pwm(struct lm3533_ctrlbank *cb, u8 *val)147{148 u8 reg;149 int ret;150 151 reg = lm3533_ctrlbank_get_reg(cb, LM3533_REG_PWM_BASE);152 ret = lm3533_read(cb->lm3533, reg, val);153 if (ret)154 dev_err(cb->dev, "failed to get PWM mask\n");155 156 return ret;157}158EXPORT_SYMBOL_GPL(lm3533_ctrlbank_get_pwm);159 160MODULE_AUTHOR("Johan Hovold <jhovold@gmail.com>");161MODULE_DESCRIPTION("LM3533 Control Bank interface");162MODULE_LICENSE("GPL");163