1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (C) 2017 Spreadtrum Communications Inc.
6 #include <linux/interrupt.h>
7 #include <linux/kernel.h>
8 #include <linux/module.h>
9 #include <linux/mfd/core.h>
10 #include <linux/mfd/sc27xx-pmic.h>
12 #include <linux/of_platform.h>
13 #include <linux/regmap.h>
14 #include <linux/spi/spi.h>
15 #include <uapi/linux/usb/charger.h>
17 #define SPRD_PMIC_INT_MASK_STATUS 0x0
18 #define SPRD_PMIC_INT_RAW_STATUS 0x4
19 #define SPRD_PMIC_INT_EN 0x8
21 #define SPRD_SC2730_IRQ_BASE 0x80
22 #define SPRD_SC2730_IRQ_NUMS 10
23 #define SPRD_SC2730_CHG_DET 0x1b9c
24 #define SPRD_SC2731_IRQ_BASE 0x140
25 #define SPRD_SC2731_IRQ_NUMS 16
26 #define SPRD_SC2731_CHG_DET 0xedc
28 /* PMIC charger detection definition */
29 #define SPRD_PMIC_CHG_DET_DELAY_US 200000
30 #define SPRD_PMIC_CHG_DET_TIMEOUT 2000000
31 #define SPRD_PMIC_CHG_DET_DONE BIT(11)
32 #define SPRD_PMIC_SDP_TYPE BIT(7)
33 #define SPRD_PMIC_DCP_TYPE BIT(6)
34 #define SPRD_PMIC_CDP_TYPE BIT(5)
35 #define SPRD_PMIC_CHG_TYPE_MASK GENMASK(7, 5)
38 struct regmap
*regmap
;
40 struct regmap_irq
*irqs
;
41 struct regmap_irq_chip irq_chip
;
42 struct regmap_irq_chip_data
*irq_data
;
43 const struct sprd_pmic_data
*pdata
;
47 struct sprd_pmic_data
{
54 * Since different PMICs of SC27xx series can have different interrupt
55 * base address and irq number, we should save irq number and irq base
56 * in the device data structure.
58 static const struct sprd_pmic_data sc2730_data
= {
59 .irq_base
= SPRD_SC2730_IRQ_BASE
,
60 .num_irqs
= SPRD_SC2730_IRQ_NUMS
,
61 .charger_det
= SPRD_SC2730_CHG_DET
,
64 static const struct sprd_pmic_data sc2731_data
= {
65 .irq_base
= SPRD_SC2731_IRQ_BASE
,
66 .num_irqs
= SPRD_SC2731_IRQ_NUMS
,
67 .charger_det
= SPRD_SC2731_CHG_DET
,
70 enum usb_charger_type
sprd_pmic_detect_charger_type(struct device
*dev
)
72 struct spi_device
*spi
= to_spi_device(dev
);
73 struct sprd_pmic
*ddata
= spi_get_drvdata(spi
);
74 const struct sprd_pmic_data
*pdata
= ddata
->pdata
;
75 enum usb_charger_type type
;
79 ret
= regmap_read_poll_timeout(ddata
->regmap
, pdata
->charger_det
, val
,
80 (val
& SPRD_PMIC_CHG_DET_DONE
),
81 SPRD_PMIC_CHG_DET_DELAY_US
,
82 SPRD_PMIC_CHG_DET_TIMEOUT
);
84 dev_err(&spi
->dev
, "failed to detect charger type\n");
88 switch (val
& SPRD_PMIC_CHG_TYPE_MASK
) {
89 case SPRD_PMIC_CDP_TYPE
:
92 case SPRD_PMIC_DCP_TYPE
:
95 case SPRD_PMIC_SDP_TYPE
:
105 EXPORT_SYMBOL_GPL(sprd_pmic_detect_charger_type
);
107 static int sprd_pmic_spi_write(void *context
, const void *data
, size_t count
)
109 struct device
*dev
= context
;
110 struct spi_device
*spi
= to_spi_device(dev
);
112 return spi_write(spi
, data
, count
);
115 static int sprd_pmic_spi_read(void *context
,
116 const void *reg
, size_t reg_size
,
117 void *val
, size_t val_size
)
119 struct device
*dev
= context
;
120 struct spi_device
*spi
= to_spi_device(dev
);
121 u32 rx_buf
[2] = { 0 };
124 /* Now we only support one PMIC register to read every time. */
125 if (reg_size
!= sizeof(u32
) || val_size
!= sizeof(u32
))
128 /* Copy address to read from into first element of SPI buffer. */
129 memcpy(rx_buf
, reg
, sizeof(u32
));
130 ret
= spi_read(spi
, rx_buf
, 1);
134 memcpy(val
, rx_buf
, val_size
);
138 static const struct regmap_bus sprd_pmic_regmap
= {
139 .write
= sprd_pmic_spi_write
,
140 .read
= sprd_pmic_spi_read
,
141 .reg_format_endian_default
= REGMAP_ENDIAN_NATIVE
,
142 .val_format_endian_default
= REGMAP_ENDIAN_NATIVE
,
145 static const struct regmap_config sprd_pmic_config
= {
149 .max_register
= 0xffff,
152 static int sprd_pmic_probe(struct spi_device
*spi
)
154 struct sprd_pmic
*ddata
;
155 const struct sprd_pmic_data
*pdata
;
158 pdata
= of_device_get_match_data(&spi
->dev
);
160 dev_err(&spi
->dev
, "No matching driver data found\n");
164 ddata
= devm_kzalloc(&spi
->dev
, sizeof(*ddata
), GFP_KERNEL
);
168 ddata
->regmap
= devm_regmap_init(&spi
->dev
, &sprd_pmic_regmap
,
169 &spi
->dev
, &sprd_pmic_config
);
170 if (IS_ERR(ddata
->regmap
)) {
171 ret
= PTR_ERR(ddata
->regmap
);
172 dev_err(&spi
->dev
, "Failed to allocate register map %d\n", ret
);
176 spi_set_drvdata(spi
, ddata
);
177 ddata
->dev
= &spi
->dev
;
178 ddata
->irq
= spi
->irq
;
179 ddata
->pdata
= pdata
;
181 ddata
->irq_chip
.name
= dev_name(&spi
->dev
);
182 ddata
->irq_chip
.status_base
=
183 pdata
->irq_base
+ SPRD_PMIC_INT_MASK_STATUS
;
184 ddata
->irq_chip
.unmask_base
= pdata
->irq_base
+ SPRD_PMIC_INT_EN
;
185 ddata
->irq_chip
.ack_base
= 0;
186 ddata
->irq_chip
.num_regs
= 1;
187 ddata
->irq_chip
.num_irqs
= pdata
->num_irqs
;
189 ddata
->irqs
= devm_kcalloc(&spi
->dev
,
190 pdata
->num_irqs
, sizeof(struct regmap_irq
),
195 ddata
->irq_chip
.irqs
= ddata
->irqs
;
196 for (i
= 0; i
< pdata
->num_irqs
; i
++)
197 ddata
->irqs
[i
].mask
= BIT(i
);
199 ret
= devm_regmap_add_irq_chip(&spi
->dev
, ddata
->regmap
, ddata
->irq
,
201 &ddata
->irq_chip
, &ddata
->irq_data
);
203 dev_err(&spi
->dev
, "Failed to add PMIC irq chip %d\n", ret
);
207 ret
= devm_of_platform_populate(&spi
->dev
);
209 dev_err(&spi
->dev
, "Failed to populate sub-devices %d\n", ret
);
213 device_init_wakeup(&spi
->dev
, true);
217 static int sprd_pmic_suspend(struct device
*dev
)
219 struct sprd_pmic
*ddata
= dev_get_drvdata(dev
);
221 if (device_may_wakeup(dev
))
222 enable_irq_wake(ddata
->irq
);
227 static int sprd_pmic_resume(struct device
*dev
)
229 struct sprd_pmic
*ddata
= dev_get_drvdata(dev
);
231 if (device_may_wakeup(dev
))
232 disable_irq_wake(ddata
->irq
);
237 static DEFINE_SIMPLE_DEV_PM_OPS(sprd_pmic_pm_ops
,
238 sprd_pmic_suspend
, sprd_pmic_resume
);
240 static const struct of_device_id sprd_pmic_match
[] = {
241 { .compatible
= "sprd,sc2730", .data
= &sc2730_data
},
242 { .compatible
= "sprd,sc2731", .data
= &sc2731_data
},
245 MODULE_DEVICE_TABLE(of
, sprd_pmic_match
);
247 static const struct spi_device_id sprd_pmic_spi_ids
[] = {
248 { .name
= "sc2730", .driver_data
= (unsigned long)&sc2730_data
},
249 { .name
= "sc2731", .driver_data
= (unsigned long)&sc2731_data
},
252 MODULE_DEVICE_TABLE(spi
, sprd_pmic_spi_ids
);
254 static struct spi_driver sprd_pmic_driver
= {
256 .name
= "sc27xx-pmic",
257 .of_match_table
= sprd_pmic_match
,
258 .pm
= pm_sleep_ptr(&sprd_pmic_pm_ops
),
260 .probe
= sprd_pmic_probe
,
261 .id_table
= sprd_pmic_spi_ids
,
264 static int __init
sprd_pmic_init(void)
266 return spi_register_driver(&sprd_pmic_driver
);
268 subsys_initcall(sprd_pmic_init
);
270 static void __exit
sprd_pmic_exit(void)
272 spi_unregister_driver(&sprd_pmic_driver
);
274 module_exit(sprd_pmic_exit
);
276 MODULE_LICENSE("GPL v2");
277 MODULE_DESCRIPTION("Spreadtrum SC27xx PMICs driver");
278 MODULE_AUTHOR("Baolin Wang <baolin.wang@spreadtrum.com>");