Lines Matching +full:range +full:- +full:microamp
2 * Copyright 2015-16 Golden Delicious Computers
106 { .compatible = "si-en,sn3199", .data = &is31fl3199_cdef, },
116 struct is31fl319x_chip *is31 = led->chip; in is31fl319x_brightness_set()
117 int chan = led - is31->leds; in is31fl319x_brightness_set()
122 dev_dbg(&is31->client->dev, "%s %d: %d\n", __func__, chan, brightness); in is31fl319x_brightness_set()
124 mutex_lock(&is31->lock); in is31fl319x_brightness_set()
127 ret = regmap_write(is31->regmap, IS31FL319X_PWM(chan), brightness); in is31fl319x_brightness_set()
132 for (i = 0; i < is31->cdef->num_leds; i++) { in is31fl319x_brightness_set()
141 ret = regmap_read(is31->regmap, IS31FL319X_PWM(i), &pwm_value); in is31fl319x_brightness_set()
142 dev_dbg(&is31->client->dev, "%s read %d: ret=%d: %d\n", in is31fl319x_brightness_set()
151 ctrl2 |= on << (i - 6); /* 6..8 => bit 0..2 */ in is31fl319x_brightness_set()
155 dev_dbg(&is31->client->dev, "power up %02x %02x\n", in is31fl319x_brightness_set()
157 regmap_write(is31->regmap, IS31FL319X_CTRL1, ctrl1); in is31fl319x_brightness_set()
158 regmap_write(is31->regmap, IS31FL319X_CTRL2, ctrl2); in is31fl319x_brightness_set()
160 regmap_write(is31->regmap, IS31FL319X_DATA_UPDATE, 0x00); in is31fl319x_brightness_set()
162 ret = regmap_write(is31->regmap, IS31FL319X_SHUTDOWN, 0x01); in is31fl319x_brightness_set()
164 dev_dbg(&is31->client->dev, "power down\n"); in is31fl319x_brightness_set()
166 ret = regmap_write(is31->regmap, IS31FL319X_SHUTDOWN, 0x00); in is31fl319x_brightness_set()
170 mutex_unlock(&is31->lock); in is31fl319x_brightness_set()
179 struct led_classdev *cdev = &led->cdev; in is31fl319x_parse_child_dt()
182 if (of_property_read_string(child, "label", &cdev->name)) in is31fl319x_parse_child_dt()
183 cdev->name = child->name; in is31fl319x_parse_child_dt()
185 ret = of_property_read_string(child, "linux,default-trigger", in is31fl319x_parse_child_dt()
186 &cdev->default_trigger); in is31fl319x_parse_child_dt()
187 if (ret < 0 && ret != -EINVAL) /* is optional */ in is31fl319x_parse_child_dt()
190 led->max_microamp = IS31FL319X_CURRENT_DEFAULT; in is31fl319x_parse_child_dt()
191 ret = of_property_read_u32(child, "led-max-microamp", in is31fl319x_parse_child_dt()
192 &led->max_microamp); in is31fl319x_parse_child_dt()
194 if (led->max_microamp < IS31FL319X_CURRENT_MIN) in is31fl319x_parse_child_dt()
195 return -EINVAL; /* not supported */ in is31fl319x_parse_child_dt()
196 led->max_microamp = min(led->max_microamp, in is31fl319x_parse_child_dt()
206 struct device_node *np = dev->of_node, *child; in is31fl319x_parse_dt()
212 return -ENODEV; in is31fl319x_parse_dt()
217 return -EINVAL; in is31fl319x_parse_dt()
220 is31->cdef = of_dev_id->data; in is31fl319x_parse_dt()
225 of_dev_id->compatible, count); in is31fl319x_parse_dt()
227 if (!count || count > is31->cdef->num_leds) { in is31fl319x_parse_dt()
229 is31->cdef->num_leds); in is31fl319x_parse_dt()
230 return -ENODEV; in is31fl319x_parse_dt()
243 if (reg < 1 || reg > is31->cdef->num_leds) { in is31fl319x_parse_dt()
245 ret = -EINVAL; in is31fl319x_parse_dt()
249 led = &is31->leds[reg - 1]; in is31fl319x_parse_dt()
251 if (led->configured) { in is31fl319x_parse_dt()
253 ret = -EINVAL; in is31fl319x_parse_dt()
263 led->configured = true; in is31fl319x_parse_dt()
266 is31->audio_gain_db = 0; in is31fl319x_parse_dt()
267 ret = of_property_read_u32(np, "audio-gain-db", &is31->audio_gain_db); in is31fl319x_parse_dt()
269 is31->audio_gain_db = min(is31->audio_gain_db, in is31fl319x_parse_dt()
290 return true; /* always write-through */ in is31fl319x_volatile_reg()
321 static inline int is31fl319x_microamp_to_cs(struct device *dev, u32 microamp) in is31fl319x_microamp_to_cs() argument
322 { /* round down to nearest supported value (range check done by caller) */ in is31fl319x_microamp_to_cs()
323 u32 step = microamp / IS31FL319X_CURRENT_STEP; in is31fl319x_microamp_to_cs()
325 return ((IS31FL319X_CONFIG2_CS_STEP_REF - step) & in is31fl319x_microamp_to_cs()
331 { /* round down to nearest supported value (range check done by caller) */ in is31fl319x_db_to_gain()
339 struct device *dev = &client->dev; in is31fl319x_probe()
340 struct i2c_adapter *adapter = to_i2c_adapter(dev->parent); in is31fl319x_probe()
346 return -EIO; in is31fl319x_probe()
348 is31 = devm_kzalloc(&client->dev, sizeof(*is31), GFP_KERNEL); in is31fl319x_probe()
350 return -ENOMEM; in is31fl319x_probe()
352 mutex_init(&is31->lock); in is31fl319x_probe()
354 err = is31fl319x_parse_dt(&client->dev, is31); in is31fl319x_probe()
358 is31->client = client; in is31fl319x_probe()
359 is31->regmap = devm_regmap_init_i2c(client, ®map_config); in is31fl319x_probe()
360 if (IS_ERR(is31->regmap)) { in is31fl319x_probe()
361 dev_err(&client->dev, "failed to allocate register map\n"); in is31fl319x_probe()
362 err = PTR_ERR(is31->regmap); in is31fl319x_probe()
368 /* check for write-reply from chip (we can't read any registers) */ in is31fl319x_probe()
369 err = regmap_write(is31->regmap, IS31FL319X_RESET, 0x00); in is31fl319x_probe()
371 dev_err(&client->dev, "no response from chip write: err = %d\n", in is31fl319x_probe()
373 err = -EIO; /* does not answer */ in is31fl319x_probe()
378 * Kernel conventions require per-LED led-max-microamp property. in is31fl319x_probe()
382 for (i = 0; i < is31->cdef->num_leds; i++) in is31fl319x_probe()
383 if (is31->leds[i].configured && in is31fl319x_probe()
384 is31->leds[i].max_microamp < aggregated_led_microamp) in is31fl319x_probe()
385 aggregated_led_microamp = is31->leds[i].max_microamp; in is31fl319x_probe()
387 regmap_write(is31->regmap, IS31FL319X_CONFIG2, in is31fl319x_probe()
389 is31fl319x_db_to_gain(is31->audio_gain_db)); in is31fl319x_probe()
391 for (i = 0; i < is31->cdef->num_leds; i++) { in is31fl319x_probe()
392 struct is31fl319x_led *led = &is31->leds[i]; in is31fl319x_probe()
394 if (!led->configured) in is31fl319x_probe()
397 led->chip = is31; in is31fl319x_probe()
398 led->cdev.brightness_set_blocking = is31fl319x_brightness_set; in is31fl319x_probe()
400 err = devm_led_classdev_register(&client->dev, &led->cdev); in is31fl319x_probe()
408 mutex_destroy(&is31->lock); in is31fl319x_probe()
416 mutex_destroy(&is31->lock); in is31fl319x_remove()
421 * i2c-core (and modalias) requires that id_table be properly filled,
437 .name = "leds-is31fl319x",