summaryrefslogtreecommitdiffstats
path: root/drivers/mfd/lm3533-ctrlbank.c
blob: c2732a37c65a9f929949d70d8d71abe6e923fb47 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
/*
 * lm3533-ctrlbank.c -- LM3533 Generic Control Bank interface
 *
 * Copyright (C) 2011-2012 Texas Instruments
 *
 * Author: Johan Hovold <jhovold@gmail.com>
 *
 * This program is free software; you can redistribute it and/or modify it
 * under  the terms of the GNU General  Public License as published by the
 * Free Software Foundation;  either version 2 of the License, or (at your
 * option) any later version.
 */

#include <linux/device.h>
#include <linux/module.h>

#include <linux/mfd/lm3533.h>


#define LM3533_BRIGHTNESS_MAX		255
#define LM3533_MAX_CURRENT_MAX		31
#define LM3533_PWM_MAX			0x3f

#define LM3533_REG_PWM_BASE		0x14
#define LM3533_REG_MAX_CURRENT_BASE	0x1f
#define LM3533_REG_CTRLBANK_ENABLE	0x27
#define LM3533_REG_BRIGHTNESS_BASE	0x40


static inline u8 lm3533_ctrlbank_get_reg(struct lm3533_ctrlbank *cb, u8 base)
{
	return base + cb->id;
}

int lm3533_ctrlbank_enable(struct lm3533_ctrlbank *cb)
{
	u8 mask;
	int ret;

	dev_dbg(cb->dev, "%s - %d\n", __func__, cb->id);

	mask = 1 << cb->id;
	ret = lm3533_update(cb->lm3533, LM3533_REG_CTRLBANK_ENABLE,
								mask, mask);
	if (ret)
		dev_err(cb->dev, "failed to enable ctrlbank %d\n", cb->id);

	return ret;
}
EXPORT_SYMBOL_GPL(lm3533_ctrlbank_enable);

int lm3533_ctrlbank_disable(struct lm3533_ctrlbank *cb)
{
	u8 mask;
	int ret;

	dev_dbg(cb->dev, "%s - %d\n", __func__, cb->id);

	mask = 1 << cb->id;
	ret = lm3533_update(cb->lm3533, LM3533_REG_CTRLBANK_ENABLE, 0, mask);
	if (ret)
		dev_err(cb->dev, "failed to disable ctrlbank %d\n", cb->id);

	return ret;
}
EXPORT_SYMBOL_GPL(lm3533_ctrlbank_disable);

#define lm3533_ctrlbank_set(_name, _NAME)				\
int lm3533_ctrlbank_set_##_name(struct lm3533_ctrlbank *cb, u8 val)	\
{									\
	u8 reg;								\
	int ret;							\
									\
	if (val > LM3533_##_NAME##_MAX)					\
		return -EINVAL;						\
									\
	reg = lm3533_ctrlbank_get_reg(cb, LM3533_REG_##_NAME##_BASE);	\
	ret = lm3533_write(cb->lm3533, reg, val);			\
	if (ret)							\
		dev_err(cb->dev, "failed to set " #_name "\n");		\
									\
	return ret;							\
}									\
EXPORT_SYMBOL_GPL(lm3533_ctrlbank_set_##_name);

#define lm3533_ctrlbank_get(_name, _NAME)				\
int lm3533_ctrlbank_get_##_name(struct lm3533_ctrlbank *cb, u8 *val)	\
{									\
	u8 reg;								\
	int ret;							\
									\
	reg = lm3533_ctrlbank_get_reg(cb, LM3533_REG_##_NAME##_BASE);	\
	ret = lm3533_read(cb->lm3533, reg, val);			\
	if (ret)							\
		dev_err(cb->dev, "failed to get " #_name "\n");		\
									\
	return ret;							\
}									\
EXPORT_SYMBOL_GPL(lm3533_ctrlbank_get_##_name);

lm3533_ctrlbank_set(brightness, BRIGHTNESS);
lm3533_ctrlbank_get(brightness, BRIGHTNESS);

/*
 * Full scale current.
 *
 * Imax = 5 + val * 0.8 mA, e.g.:
 *
 *    0 - 5 mA
 *     ...
 *   19 - 20.2 mA (default)
 *     ...
 *   31 - 29.8 mA
 */
lm3533_ctrlbank_set(max_current, MAX_CURRENT);
lm3533_ctrlbank_get(max_current, MAX_CURRENT);

/*
 * PWM-input control mask:
 *
 *   bit 5 - PWM-input enabled in Zone 4
 *   bit 4 - PWM-input enabled in Zone 3
 *   bit 3 - PWM-input enabled in Zone 2
 *   bit 2 - PWM-input enabled in Zone 1
 *   bit 1 - PWM-input enabled in Zone 0
 *   bit 0 - PWM-input enabled
 */
lm3533_ctrlbank_set(pwm, PWM);
lm3533_ctrlbank_get(pwm, PWM);


MODULE_AUTHOR("Johan Hovold <jhovold@gmail.com>");
MODULE_DESCRIPTION("LM3533 Control Bank interface");
MODULE_LICENSE("GPL");