Commit | Line | Data |
---|---|---|
2edd3b69 LW |
1 | /* |
2 | * Driver for TPS61050/61052 boost converters, typically used for white LEDs | |
3 | * or audio amplifiers. | |
4 | * | |
5 | * Copyright (C) 2011 ST-Ericsson SA | |
6 | * Written on behalf of Linaro for ST-Ericsson | |
7 | * | |
8 | * Author: Linus Walleij <linus.walleij@linaro.org> | |
9 | * | |
10 | * License terms: GNU General Public License (GPL) version 2 | |
11 | */ | |
12 | ||
13 | #include <linux/module.h> | |
14 | #include <linux/kernel.h> | |
15 | #include <linux/init.h> | |
16 | #include <linux/err.h> | |
7e507119 | 17 | #include <linux/regmap.h> |
2edd3b69 LW |
18 | #include <linux/platform_device.h> |
19 | #include <linux/regulator/driver.h> | |
20 | #include <linux/mfd/core.h> | |
21 | #include <linux/mfd/tps6105x.h> | |
22 | ||
c55979b7 | 23 | static const unsigned int tps6105x_voltages[] = { |
2edd3b69 LW |
24 | 4500000, |
25 | 5000000, | |
26 | 5250000, | |
27 | 5000000, /* There is an additional 5V */ | |
28 | }; | |
29 | ||
2edd3b69 | 30 | static struct regulator_ops tps6105x_regulator_ops = { |
fad2ba68 AL |
31 | .enable = regulator_enable_regmap, |
32 | .disable = regulator_disable_regmap, | |
33 | .is_enabled = regulator_is_enabled_regmap, | |
34 | .get_voltage_sel = regulator_get_voltage_sel_regmap, | |
35 | .set_voltage_sel = regulator_set_voltage_sel_regmap, | |
c55979b7 | 36 | .list_voltage = regulator_list_voltage_table, |
2edd3b69 LW |
37 | }; |
38 | ||
d882d73e | 39 | static const struct regulator_desc tps6105x_regulator_desc = { |
2edd3b69 LW |
40 | .name = "tps6105x-boost", |
41 | .ops = &tps6105x_regulator_ops, | |
42 | .type = REGULATOR_VOLTAGE, | |
43 | .id = 0, | |
44 | .owner = THIS_MODULE, | |
45 | .n_voltages = ARRAY_SIZE(tps6105x_voltages), | |
c55979b7 | 46 | .volt_table = tps6105x_voltages, |
fad2ba68 AL |
47 | .vsel_reg = TPS6105X_REG_0, |
48 | .vsel_mask = TPS6105X_REG0_VOLTAGE_MASK, | |
49 | .enable_reg = TPS6105X_REG_0, | |
50 | .enable_mask = TPS6105X_REG0_MODE_MASK, | |
51 | .enable_val = TPS6105X_REG0_MODE_VOLTAGE << | |
52 | TPS6105X_REG0_MODE_SHIFT, | |
2edd3b69 LW |
53 | }; |
54 | ||
55 | /* | |
56 | * Registers the chip as a voltage regulator | |
57 | */ | |
a5023574 | 58 | static int tps6105x_regulator_probe(struct platform_device *pdev) |
2edd3b69 | 59 | { |
a7c98ce2 | 60 | struct tps6105x *tps6105x = dev_get_platdata(&pdev->dev); |
2edd3b69 | 61 | struct tps6105x_platform_data *pdata = tps6105x->pdata; |
c172708d | 62 | struct regulator_config config = { }; |
2edd3b69 LW |
63 | int ret; |
64 | ||
65 | /* This instance is not set for regulator mode so bail out */ | |
66 | if (pdata->mode != TPS6105X_MODE_VOLTAGE) { | |
67 | dev_info(&pdev->dev, | |
4932e89d | 68 | "chip not in voltage mode mode, exit probe\n"); |
2edd3b69 LW |
69 | return 0; |
70 | } | |
71 | ||
c172708d MB |
72 | config.dev = &tps6105x->client->dev; |
73 | config.init_data = pdata->regulator_data; | |
74 | config.driver_data = tps6105x; | |
fad2ba68 | 75 | config.regmap = tps6105x->regmap; |
c172708d | 76 | |
2edd3b69 | 77 | /* Register regulator with framework */ |
6a2b5a93 JH |
78 | tps6105x->regulator = devm_regulator_register(&pdev->dev, |
79 | &tps6105x_regulator_desc, | |
80 | &config); | |
2edd3b69 LW |
81 | if (IS_ERR(tps6105x->regulator)) { |
82 | ret = PTR_ERR(tps6105x->regulator); | |
83 | dev_err(&tps6105x->client->dev, | |
84 | "failed to register regulator\n"); | |
85 | return ret; | |
86 | } | |
f0f060bd | 87 | platform_set_drvdata(pdev, tps6105x); |
2edd3b69 LW |
88 | |
89 | return 0; | |
90 | } | |
91 | ||
2edd3b69 LW |
92 | static struct platform_driver tps6105x_regulator_driver = { |
93 | .driver = { | |
94 | .name = "tps6105x-regulator", | |
2edd3b69 LW |
95 | }, |
96 | .probe = tps6105x_regulator_probe, | |
2edd3b69 LW |
97 | }; |
98 | ||
99 | static __init int tps6105x_regulator_init(void) | |
100 | { | |
101 | return platform_driver_register(&tps6105x_regulator_driver); | |
102 | } | |
103 | subsys_initcall(tps6105x_regulator_init); | |
104 | ||
105 | static __exit void tps6105x_regulator_exit(void) | |
106 | { | |
107 | platform_driver_unregister(&tps6105x_regulator_driver); | |
108 | } | |
109 | module_exit(tps6105x_regulator_exit); | |
110 | ||
111 | MODULE_AUTHOR("Linus Walleij <linus.walleij@linaro.org>"); | |
112 | MODULE_DESCRIPTION("TPS6105x regulator driver"); | |
113 | MODULE_LICENSE("GPL v2"); | |
114 | MODULE_ALIAS("platform:tps6105x-regulator"); |