2 * tps65910.c -- TI TPS6591x
4 * Copyright 2010 Texas Instruments Inc.
6 * Author: Jorge Eduardo Candelaria <jedu@slimlogic.co.uk>
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the
10 * Free Software Foundation; either version 2 of the License, or (at your
11 * option) any later version.
15 #include <linux/kernel.h>
16 #include <linux/module.h>
17 #include <linux/init.h>
18 #include <linux/slab.h>
19 #include <linux/err.h>
20 #include <linux/platform_device.h>
21 #include <linux/debugfs.h>
22 #include <linux/gpio.h>
23 #include <linux/mfd/tps65910.h>
28 /* Comparator 1 voltage selection table in millivolts */
29 static const u16 COMP_VSEL_TABLE
[] = {
30 0, 2500, 2500, 2500, 2500, 2550, 2600, 2650,
31 2700, 2750, 2800, 2850, 2900, 2950, 3000, 3050,
32 3100, 3150, 3200, 3250, 3300, 3350, 3400, 3450,
40 const u16
*vsel_table
;
43 static struct comparator tps_comparators
[] = {
46 .reg
= TPS65911_VMBCH
,
48 .vsel_table
= COMP_VSEL_TABLE
,
52 .reg
= TPS65911_VMBCH2
,
54 .vsel_table
= COMP_VSEL_TABLE
,
58 static int comp_threshold_set(struct tps65910
*tps65910
, int id
, int voltage
)
60 struct comparator tps_comp
= tps_comparators
[id
];
65 while (curr_voltage
< tps_comp
.uV_max
) {
66 curr_voltage
= tps_comp
.vsel_table
[index
];
67 if (curr_voltage
>= voltage
)
69 else if (curr_voltage
< voltage
)
73 if (curr_voltage
> tps_comp
.uV_max
)
77 ret
= tps65910_reg_write(tps65910
, tps_comp
.reg
, val
);
82 static int comp_threshold_get(struct tps65910
*tps65910
, int id
)
84 struct comparator tps_comp
= tps_comparators
[id
];
88 ret
= tps65910_reg_read(tps65910
, tps_comp
.reg
, &val
);
93 return tps_comp
.vsel_table
[val
];
96 static ssize_t
comp_threshold_show(struct device
*dev
,
97 struct device_attribute
*attr
, char *buf
)
99 struct tps65910
*tps65910
= dev_get_drvdata(dev
->parent
);
100 struct attribute comp_attr
= attr
->attr
;
103 if (!strcmp(comp_attr
.name
, "comp1_threshold"))
105 else if (!strcmp(comp_attr
.name
, "comp2_threshold"))
110 uVolt
= comp_threshold_get(tps65910
, id
);
112 return sprintf(buf
, "%d\n", uVolt
);
115 static DEVICE_ATTR(comp1_threshold
, S_IRUGO
, comp_threshold_show
, NULL
);
116 static DEVICE_ATTR(comp2_threshold
, S_IRUGO
, comp_threshold_show
, NULL
);
118 static int tps65911_comparator_probe(struct platform_device
*pdev
)
120 struct tps65910
*tps65910
= dev_get_drvdata(pdev
->dev
.parent
);
121 struct tps65910_board
*pdata
= dev_get_platdata(tps65910
->dev
);
124 ret
= comp_threshold_set(tps65910
, COMP1
, pdata
->vmbch_threshold
);
126 dev_err(&pdev
->dev
, "cannot set COMP1 threshold\n");
130 ret
= comp_threshold_set(tps65910
, COMP2
, pdata
->vmbch2_threshold
);
132 dev_err(&pdev
->dev
, "cannot set COMP2 threshold\n");
136 /* Create sysfs entry */
137 ret
= device_create_file(&pdev
->dev
, &dev_attr_comp1_threshold
);
139 dev_err(&pdev
->dev
, "failed to add COMP1 sysfs file\n");
141 ret
= device_create_file(&pdev
->dev
, &dev_attr_comp2_threshold
);
143 dev_err(&pdev
->dev
, "failed to add COMP2 sysfs file\n");
148 static int tps65911_comparator_remove(struct platform_device
*pdev
)
150 struct tps65910
*tps65910
;
152 tps65910
= dev_get_drvdata(pdev
->dev
.parent
);
153 device_remove_file(&pdev
->dev
, &dev_attr_comp2_threshold
);
154 device_remove_file(&pdev
->dev
, &dev_attr_comp1_threshold
);
159 static struct platform_driver tps65911_comparator_driver
= {
161 .name
= "tps65911-comparator",
163 .probe
= tps65911_comparator_probe
,
164 .remove
= tps65911_comparator_remove
,
167 static int __init
tps65911_comparator_init(void)
169 return platform_driver_register(&tps65911_comparator_driver
);
171 subsys_initcall(tps65911_comparator_init
);
173 static void __exit
tps65911_comparator_exit(void)
175 platform_driver_unregister(&tps65911_comparator_driver
);
177 module_exit(tps65911_comparator_exit
);
179 MODULE_AUTHOR("Jorge Eduardo Candelaria <jedu@slimlogic.co.uk>");
180 MODULE_DESCRIPTION("TPS65911 comparator driver");
181 MODULE_LICENSE("GPL v2");
182 MODULE_ALIAS("platform:tps65911-comparator");