Blame view

drivers/mfd/lm3533-ctrlbank.c 3.62 KB
2874c5fd2   Thomas Gleixner   treewide: Replace...
1
  // SPDX-License-Identifier: GPL-2.0-or-later
16c5c023a   Johan Hovold   mfd: Add LM3533 l...
2
3
4
5
6
7
  /*
   * lm3533-ctrlbank.c -- LM3533 Generic Control Bank interface
   *
   * Copyright (C) 2011-2012 Texas Instruments
   *
   * Author: Johan Hovold <jhovold@gmail.com>
16c5c023a   Johan Hovold   mfd: Add LM3533 l...
8
9
10
11
12
13
   */
  
  #include <linux/device.h>
  #include <linux/module.h>
  
  #include <linux/mfd/lm3533.h>
6fa4b9d80   Johan Hovold   mfd: Use SI-units...
14
15
16
  #define LM3533_MAX_CURRENT_MIN		5000
  #define LM3533_MAX_CURRENT_MAX		29800
  #define LM3533_MAX_CURRENT_STEP		800
16c5c023a   Johan Hovold   mfd: Add LM3533 l...
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
  #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
  ", __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
  ", 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
  ", __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
  ", cb->id);
  
  	return ret;
  }
  EXPORT_SYMBOL_GPL(lm3533_ctrlbank_disable);
6fa4b9d80   Johan Hovold   mfd: Use SI-units...
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
  /*
   * Full-scale current.
   *
   * imax		5000 - 29800 uA (800 uA step)
   */
  int lm3533_ctrlbank_set_max_current(struct lm3533_ctrlbank *cb, u16 imax)
  {
  	u8 reg;
  	u8 val;
  	int ret;
  
  	if (imax < LM3533_MAX_CURRENT_MIN || imax > LM3533_MAX_CURRENT_MAX)
  		return -EINVAL;
  
  	val = (imax - LM3533_MAX_CURRENT_MIN) / LM3533_MAX_CURRENT_STEP;
  
  	reg = lm3533_ctrlbank_get_reg(cb, LM3533_REG_MAX_CURRENT_BASE);
  	ret = lm3533_write(cb->lm3533, reg, val);
  	if (ret)
  		dev_err(cb->dev, "failed to set max current
  ");
  
  	return ret;
  }
  EXPORT_SYMBOL_GPL(lm3533_ctrlbank_set_max_current);
4d3ec936f   Johan Hovold   mfd: lm3533: Expa...
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
  int lm3533_ctrlbank_set_brightness(struct lm3533_ctrlbank *cb, u8 val)
  {
  	u8 reg;
  	int ret;
  
  	reg = lm3533_ctrlbank_get_reg(cb, LM3533_REG_BRIGHTNESS_BASE);
  	ret = lm3533_write(cb->lm3533, reg, val);
  	if (ret)
  		dev_err(cb->dev, "failed to set brightness
  ");
  
  	return ret;
  }
  EXPORT_SYMBOL_GPL(lm3533_ctrlbank_set_brightness);
  
  int lm3533_ctrlbank_get_brightness(struct lm3533_ctrlbank *cb, u8 *val)
  {
  	u8 reg;
  	int ret;
  
  	reg = lm3533_ctrlbank_get_reg(cb, LM3533_REG_BRIGHTNESS_BASE);
  	ret = lm3533_read(cb->lm3533, reg, val);
  	if (ret)
  		dev_err(cb->dev, "failed to get brightness
  ");
  
  	return ret;
  }
  EXPORT_SYMBOL_GPL(lm3533_ctrlbank_get_brightness);
16c5c023a   Johan Hovold   mfd: Add LM3533 l...
120
121
  
  /*
16c5c023a   Johan Hovold   mfd: Add LM3533 l...
122
123
124
125
126
127
128
129
130
   * 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
   */
4d3ec936f   Johan Hovold   mfd: lm3533: Expa...
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
  int lm3533_ctrlbank_set_pwm(struct lm3533_ctrlbank *cb, u8 val)
  {
  	u8 reg;
  	int ret;
  
  	if (val > LM3533_PWM_MAX)
  		return -EINVAL;
  
  	reg = lm3533_ctrlbank_get_reg(cb, LM3533_REG_PWM_BASE);
  	ret = lm3533_write(cb->lm3533, reg, val);
  	if (ret)
  		dev_err(cb->dev, "failed to set PWM mask
  ");
  
  	return ret;
  }
  EXPORT_SYMBOL_GPL(lm3533_ctrlbank_set_pwm);
  
  int lm3533_ctrlbank_get_pwm(struct lm3533_ctrlbank *cb, u8 *val)
  {
  	u8 reg;
  	int ret;
16c5c023a   Johan Hovold   mfd: Add LM3533 l...
153

4d3ec936f   Johan Hovold   mfd: lm3533: Expa...
154
155
156
157
158
159
160
161
162
  	reg = lm3533_ctrlbank_get_reg(cb, LM3533_REG_PWM_BASE);
  	ret = lm3533_read(cb->lm3533, reg, val);
  	if (ret)
  		dev_err(cb->dev, "failed to get PWM mask
  ");
  
  	return ret;
  }
  EXPORT_SYMBOL_GPL(lm3533_ctrlbank_get_pwm);
16c5c023a   Johan Hovold   mfd: Add LM3533 l...
163
164
165
166
  
  MODULE_AUTHOR("Johan Hovold <jhovold@gmail.com>");
  MODULE_DESCRIPTION("LM3533 Control Bank interface");
  MODULE_LICENSE("GPL");