2 * tps65912-core.c -- TI TPS65912x
4 * Copyright 2011 Texas Instruments Inc.
6 * Author: Margarita Olaya Cabrera <magi@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.
13 * This driver is based on wm8350 implementation.
16 #include <linux/module.h>
17 #include <linux/moduleparam.h>
18 #include <linux/init.h>
19 #include <linux/slab.h>
20 #include <linux/gpio.h>
21 #include <linux/mfd/core.h>
22 #include <linux/mfd/tps65912.h>
24 static struct mfd_cell tps65912s
[] = {
26 .name
= "tps65912-pmic",
30 int tps65912_set_bits(struct tps65912
*tps65912
, u8 reg
, u8 mask
)
35 mutex_lock(&tps65912
->io_mutex
);
37 err
= tps65912
->read(tps65912
, reg
, 1, &data
);
39 dev_err(tps65912
->dev
, "Read from reg 0x%x failed\n", reg
);
44 err
= tps65912
->write(tps65912
, reg
, 1, &data
);
46 dev_err(tps65912
->dev
, "Write to reg 0x%x failed\n", reg
);
49 mutex_unlock(&tps65912
->io_mutex
);
52 EXPORT_SYMBOL_GPL(tps65912_set_bits
);
54 int tps65912_clear_bits(struct tps65912
*tps65912
, u8 reg
, u8 mask
)
59 mutex_lock(&tps65912
->io_mutex
);
60 err
= tps65912
->read(tps65912
, reg
, 1, &data
);
62 dev_err(tps65912
->dev
, "Read from reg 0x%x failed\n", reg
);
67 err
= tps65912
->write(tps65912
, reg
, 1, &data
);
69 dev_err(tps65912
->dev
, "Write to reg 0x%x failed\n", reg
);
72 mutex_unlock(&tps65912
->io_mutex
);
75 EXPORT_SYMBOL_GPL(tps65912_clear_bits
);
77 static inline int tps65912_read(struct tps65912
*tps65912
, u8 reg
)
82 err
= tps65912
->read(tps65912
, reg
, 1, &val
);
89 static inline int tps65912_write(struct tps65912
*tps65912
, u8 reg
, u8 val
)
91 return tps65912
->write(tps65912
, reg
, 1, &val
);
94 int tps65912_reg_read(struct tps65912
*tps65912
, u8 reg
)
98 mutex_lock(&tps65912
->io_mutex
);
100 data
= tps65912_read(tps65912
, reg
);
102 dev_err(tps65912
->dev
, "Read from reg 0x%x failed\n", reg
);
104 mutex_unlock(&tps65912
->io_mutex
);
107 EXPORT_SYMBOL_GPL(tps65912_reg_read
);
109 int tps65912_reg_write(struct tps65912
*tps65912
, u8 reg
, u8 val
)
113 mutex_lock(&tps65912
->io_mutex
);
115 err
= tps65912_write(tps65912
, reg
, val
);
117 dev_err(tps65912
->dev
, "Write for reg 0x%x failed\n", reg
);
119 mutex_unlock(&tps65912
->io_mutex
);
122 EXPORT_SYMBOL_GPL(tps65912_reg_write
);
124 int tps65912_device_init(struct tps65912
*tps65912
)
126 struct tps65912_board
*pmic_plat_data
= tps65912
->dev
->platform_data
;
127 struct tps65912_platform_data
*init_data
;
128 int ret
, dcdc_avs
, value
;
130 init_data
= kzalloc(sizeof(struct tps65912_platform_data
), GFP_KERNEL
);
131 if (init_data
== NULL
)
134 mutex_init(&tps65912
->io_mutex
);
135 dev_set_drvdata(tps65912
->dev
, tps65912
);
137 dcdc_avs
= (pmic_plat_data
->is_dcdc1_avs
<< 0 |
138 pmic_plat_data
->is_dcdc2_avs
<< 1 |
139 pmic_plat_data
->is_dcdc3_avs
<< 2 |
140 pmic_plat_data
->is_dcdc4_avs
<< 3);
142 tps65912
->read(tps65912
, TPS65912_I2C_SPI_CFG
, 1, &value
);
144 tps65912
->write(tps65912
, TPS65912_I2C_SPI_CFG
, 1, &dcdc_avs
);
147 ret
= mfd_add_devices(tps65912
->dev
, -1,
148 tps65912s
, ARRAY_SIZE(tps65912s
),
153 init_data
->irq
= pmic_plat_data
->irq
;
154 init_data
->irq_base
= pmic_plat_data
->irq
;
155 ret
= tps65912_irq_init(tps65912
, init_data
->irq
, init_data
);
164 mfd_remove_devices(tps65912
->dev
);
169 void tps65912_device_exit(struct tps65912
*tps65912
)
171 mfd_remove_devices(tps65912
->dev
);
175 MODULE_AUTHOR("Margarita Olaya <magi@slimlogic.co.uk>");
176 MODULE_DESCRIPTION("TPS65912x chip family multi-function driver");
177 MODULE_LICENSE("GPL");