brintos

brintos / linux-shallow public Read only

0
0
Text · 3.6 KiB · 2537dfa Raw
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