Lines Matching defs:wm8994
3 * wm8994-core.c -- Device access for Wolfson WM8994
24 #include <linux/mfd/wm8994/core.h>
25 #include <linux/mfd/wm8994/pdata.h>
26 #include <linux/mfd/wm8994/registers.h>
28 #include "wm8994.h"
32 .name = "wm8994-ldo",
37 .name = "wm8994-ldo",
61 .name = "wm8994-codec",
67 .name = "wm8994-gpio",
115 struct wm8994 *wm8994 = dev_get_drvdata(dev);
120 switch (wm8994->type) {
123 ret = wm8994_reg_read(wm8994, WM8958_MIC_DETECT_1);
137 if (!wm8994->ldo_ena_always_driven)
138 wm8994_set_bits(wm8994, WM8994_PULL_CONTROL_2,
145 wm8994_reg_write(wm8994, WM8994_SOFTWARE_RESET,
146 wm8994_reg_read(wm8994, WM8994_SOFTWARE_RESET));
148 regcache_mark_dirty(wm8994->regmap);
153 ret = regcache_sync_region(wm8994->regmap, WM8994_GPIO_1,
159 ret = regcache_sync_region(wm8994->regmap,
165 regcache_cache_only(wm8994->regmap, true);
166 wm8994->suspended = true;
168 ret = regulator_bulk_disable(wm8994->num_supplies,
169 wm8994->supplies);
180 struct wm8994 *wm8994 = dev_get_drvdata(dev);
184 if (!wm8994->suspended)
187 ret = regulator_bulk_enable(wm8994->num_supplies,
188 wm8994->supplies);
194 regcache_cache_only(wm8994->regmap, false);
195 ret = regcache_sync(wm8994->regmap);
202 wm8994_set_bits(wm8994, WM8994_PULL_CONTROL_2,
206 wm8994->suspended = false;
211 regulator_bulk_disable(wm8994->num_supplies, wm8994->supplies);
261 static int wm8994_set_pdata_from_of(struct wm8994 *wm8994)
263 struct device_node *np = wm8994->dev->of_node;
264 struct wm8994_pdata *pdata = &wm8994->pdata;
273 if (wm8994->pdata.gpio_defaults[i] == 0)
295 static int wm8994_set_pdata_from_of(struct wm8994 *wm8994)
304 static int wm8994_device_init(struct wm8994 *wm8994, int irq)
313 if (dev_get_platdata(wm8994->dev)) {
314 pdata = dev_get_platdata(wm8994->dev);
315 wm8994->pdata = *pdata;
317 pdata = &wm8994->pdata;
319 ret = wm8994_set_pdata_from_of(wm8994);
324 ret = mfd_add_devices(wm8994->dev, 0,
329 dev_err(wm8994->dev, "Failed to add children: %d\n", ret);
333 switch (wm8994->type) {
335 wm8994->num_supplies = ARRAY_SIZE(wm1811_main_supplies);
338 wm8994->num_supplies = ARRAY_SIZE(wm8994_main_supplies);
341 wm8994->num_supplies = ARRAY_SIZE(wm8958_main_supplies);
348 wm8994->supplies = devm_kcalloc(wm8994->dev,
349 wm8994->num_supplies,
352 if (!wm8994->supplies) {
357 switch (wm8994->type) {
360 wm8994->supplies[i].supply = wm1811_main_supplies[i];
364 wm8994->supplies[i].supply = wm8994_main_supplies[i];
368 wm8994->supplies[i].supply = wm8958_main_supplies[i];
377 * wm8994->dev's children (regulators) and those regulators are
380 ret = regulator_bulk_get(wm8994->dev, wm8994->num_supplies,
381 wm8994->supplies);
384 dev_err(wm8994->dev, "Failed to get supplies: %d\n",
389 ret = regulator_bulk_enable(wm8994->num_supplies, wm8994->supplies);
391 dev_err(wm8994->dev, "Failed to enable supplies: %d\n", ret);
395 ret = wm8994_reg_read(wm8994, WM8994_SOFTWARE_RESET);
397 dev_err(wm8994->dev, "Failed to read ID register\n");
403 if (wm8994->type != WM1811)
404 dev_warn(wm8994->dev, "Device registered as type %d\n",
405 wm8994->type);
406 wm8994->type = WM1811;
410 if (wm8994->type != WM8994)
411 dev_warn(wm8994->dev, "Device registered as type %d\n",
412 wm8994->type);
413 wm8994->type = WM8994;
417 if (wm8994->type != WM8958)
418 dev_warn(wm8994->dev, "Device registered as type %d\n",
419 wm8994->type);
420 wm8994->type = WM8958;
423 dev_err(wm8994->dev, "Device is not a WM8994, ID is %x\n",
429 ret = wm8994_reg_read(wm8994, WM8994_CHIP_REVISION);
431 dev_err(wm8994->dev, "Failed to read revision register: %d\n",
435 wm8994->revision = ret & WM8994_CHIP_REV_MASK;
436 wm8994->cust_id = (ret & WM8994_CUST_ID_MASK) >> WM8994_CUST_ID_SHIFT;
438 switch (wm8994->type) {
440 switch (wm8994->revision) {
443 dev_warn(wm8994->dev,
445 'A' + wm8994->revision);
457 switch (wm8994->revision) {
469 if (wm8994->revision > 1)
470 wm8994->revision++;
480 dev_info(wm8994->dev, "%s revision %c CUST_ID %02x\n", devname,
481 'A' + wm8994->revision, wm8994->cust_id);
483 switch (wm8994->type) {
494 dev_err(wm8994->dev, "Unknown device type %d\n", wm8994->type);
499 ret = regmap_reinit_cache(wm8994->regmap, regmap_config);
501 dev_err(wm8994->dev, "Failed to reinit register cache: %d\n",
510 ret = wm8994_reg_write(wm8994, WM8994_SOFTWARE_RESET,
511 wm8994_reg_read(wm8994, WM8994_SOFTWARE_RESET));
513 dev_err(wm8994->dev, "Failed to reset device: %d\n", ret);
518 ret = regmap_register_patch(wm8994->regmap, regmap_patch,
521 dev_err(wm8994->dev, "Failed to register patch: %d\n",
527 wm8994->irq_base = pdata->irq_base;
528 wm8994->gpio_base = pdata->gpio_base;
533 wm8994_set_bits(wm8994, WM8994_GPIO_1 + i,
538 wm8994->ldo_ena_always_driven = pdata->ldo_ena_always_driven;
546 wm8994_set_bits(wm8994, WM8994_PULL_CONTROL_2,
559 wm8994_set_bits(wm8994, WM8994_LDO_1 + i,
562 wm8994_set_bits(wm8994, WM8994_LDO_1 + i,
566 wm8994_irq_init(wm8994);
568 ret = mfd_add_devices(wm8994->dev, -1,
572 dev_err(wm8994->dev, "Failed to add children: %d\n", ret);
576 pm_runtime_set_active(wm8994->dev);
577 pm_runtime_enable(wm8994->dev);
578 pm_runtime_idle(wm8994->dev);
583 wm8994_irq_exit(wm8994);
585 regulator_bulk_disable(wm8994->num_supplies,
586 wm8994->supplies);
588 regulator_bulk_free(wm8994->num_supplies, wm8994->supplies);
590 mfd_remove_devices(wm8994->dev);
594 static void wm8994_device_exit(struct wm8994 *wm8994)
596 pm_runtime_get_sync(wm8994->dev);
597 pm_runtime_disable(wm8994->dev);
598 pm_runtime_put_noidle(wm8994->dev);
599 wm8994_irq_exit(wm8994);
600 regulator_bulk_disable(wm8994->num_supplies, wm8994->supplies);
601 regulator_bulk_free(wm8994->num_supplies, wm8994->supplies);
602 mfd_remove_devices(wm8994->dev);
607 { .compatible = "wlf,wm8994", .data = (void *)WM8994 },
617 struct wm8994 *wm8994;
620 wm8994 = devm_kzalloc(&i2c->dev, sizeof(struct wm8994), GFP_KERNEL);
621 if (wm8994 == NULL)
624 i2c_set_clientdata(i2c, wm8994);
625 wm8994->dev = &i2c->dev;
626 wm8994->irq = i2c->irq;
631 wm8994->type = (uintptr_t)of_id->data;
633 wm8994->type = id->driver_data;
636 wm8994->regmap = devm_regmap_init_i2c(i2c, &wm8994_base_regmap_config);
637 if (IS_ERR(wm8994->regmap)) {
638 ret = PTR_ERR(wm8994->regmap);
639 dev_err(wm8994->dev, "Failed to allocate register map: %d\n",
644 return wm8994_device_init(wm8994, i2c->irq);
649 struct wm8994 *wm8994 = i2c_get_clientdata(i2c);
651 wm8994_device_exit(wm8994);
657 { "wm8994", WM8994 },
669 .name = "wm8994",