1 // SPDX-License-Identifier: GPL-2.0-only
2 /*
3  * Driver for Motorola PCAP2 as present in EZX phones
4  *
5  * Copyright (C) 2006 Harald Welte <laforge@openezx.org>
6  * Copyright (C) 2009 Daniel Ribeiro <drwyrm@gmail.com>
7  */
8 
9 #include <linux/module.h>
10 #include <linux/kernel.h>
11 #include <linux/platform_device.h>
12 #include <linux/interrupt.h>
13 #include <linux/irq.h>
14 #include <linux/mfd/ezx-pcap.h>
15 #include <linux/spi/spi.h>
16 #include <linux/gpio.h>
17 #include <linux/slab.h>
18 
19 #define PCAP_ADC_MAXQ		8
20 struct pcap_adc_request {
21 	u8 bank;
22 	u8 ch[2];
23 	u32 flags;
24 	void (*callback)(void *, u16[]);
25 	void *data;
26 };
27 
28 struct pcap_chip {
29 	struct spi_device *spi;
30 
31 	/* IO */
32 	u32 buf;
33 	spinlock_t io_lock;
34 
35 	/* IRQ */
36 	unsigned int irq_base;
37 	u32 msr;
38 	struct work_struct isr_work;
39 	struct work_struct msr_work;
40 	struct workqueue_struct *workqueue;
41 
42 	/* ADC */
43 	struct pcap_adc_request *adc_queue[PCAP_ADC_MAXQ];
44 	u8 adc_head;
45 	u8 adc_tail;
46 	spinlock_t adc_lock;
47 };
48 
49 /* IO */
ezx_pcap_putget(struct pcap_chip * pcap,u32 * data)50 static int ezx_pcap_putget(struct pcap_chip *pcap, u32 *data)
51 {
52 	struct spi_transfer t;
53 	struct spi_message m;
54 	int status;
55 
56 	memset(&t, 0, sizeof(t));
57 	spi_message_init(&m);
58 	t.len = sizeof(u32);
59 	spi_message_add_tail(&t, &m);
60 
61 	pcap->buf = *data;
62 	t.tx_buf = (u8 *) &pcap->buf;
63 	t.rx_buf = (u8 *) &pcap->buf;
64 	status = spi_sync(pcap->spi, &m);
65 
66 	if (status == 0)
67 		*data = pcap->buf;
68 
69 	return status;
70 }
71 
ezx_pcap_write(struct pcap_chip * pcap,u8 reg_num,u32 value)72 int ezx_pcap_write(struct pcap_chip *pcap, u8 reg_num, u32 value)
73 {
74 	unsigned long flags;
75 	int ret;
76 
77 	spin_lock_irqsave(&pcap->io_lock, flags);
78 	value &= PCAP_REGISTER_VALUE_MASK;
79 	value |= PCAP_REGISTER_WRITE_OP_BIT
80 		| (reg_num << PCAP_REGISTER_ADDRESS_SHIFT);
81 	ret = ezx_pcap_putget(pcap, &value);
82 	spin_unlock_irqrestore(&pcap->io_lock, flags);
83 
84 	return ret;
85 }
86 EXPORT_SYMBOL_GPL(ezx_pcap_write);
87 
ezx_pcap_read(struct pcap_chip * pcap,u8 reg_num,u32 * value)88 int ezx_pcap_read(struct pcap_chip *pcap, u8 reg_num, u32 *value)
89 {
90 	unsigned long flags;
91 	int ret;
92 
93 	spin_lock_irqsave(&pcap->io_lock, flags);
94 	*value = PCAP_REGISTER_READ_OP_BIT
95 		| (reg_num << PCAP_REGISTER_ADDRESS_SHIFT);
96 
97 	ret = ezx_pcap_putget(pcap, value);
98 	spin_unlock_irqrestore(&pcap->io_lock, flags);
99 
100 	return ret;
101 }
102 EXPORT_SYMBOL_GPL(ezx_pcap_read);
103 
ezx_pcap_set_bits(struct pcap_chip * pcap,u8 reg_num,u32 mask,u32 val)104 int ezx_pcap_set_bits(struct pcap_chip *pcap, u8 reg_num, u32 mask, u32 val)
105 {
106 	unsigned long flags;
107 	int ret;
108 	u32 tmp = PCAP_REGISTER_READ_OP_BIT |
109 		(reg_num << PCAP_REGISTER_ADDRESS_SHIFT);
110 
111 	spin_lock_irqsave(&pcap->io_lock, flags);
112 	ret = ezx_pcap_putget(pcap, &tmp);
113 	if (ret)
114 		goto out_unlock;
115 
116 	tmp &= (PCAP_REGISTER_VALUE_MASK & ~mask);
117 	tmp |= (val & mask) | PCAP_REGISTER_WRITE_OP_BIT |
118 		(reg_num << PCAP_REGISTER_ADDRESS_SHIFT);
119 
120 	ret = ezx_pcap_putget(pcap, &tmp);
121 out_unlock:
122 	spin_unlock_irqrestore(&pcap->io_lock, flags);
123 
124 	return ret;
125 }
126 EXPORT_SYMBOL_GPL(ezx_pcap_set_bits);
127 
128 /* IRQ */
irq_to_pcap(struct pcap_chip * pcap,int irq)129 int irq_to_pcap(struct pcap_chip *pcap, int irq)
130 {
131 	return irq - pcap->irq_base;
132 }
133 EXPORT_SYMBOL_GPL(irq_to_pcap);
134 
pcap_to_irq(struct pcap_chip * pcap,int irq)135 int pcap_to_irq(struct pcap_chip *pcap, int irq)
136 {
137 	return pcap->irq_base + irq;
138 }
139 EXPORT_SYMBOL_GPL(pcap_to_irq);
140 
pcap_mask_irq(struct irq_data * d)141 static void pcap_mask_irq(struct irq_data *d)
142 {
143 	struct pcap_chip *pcap = irq_data_get_irq_chip_data(d);
144 
145 	pcap->msr |= 1 << irq_to_pcap(pcap, d->irq);
146 	queue_work(pcap->workqueue, &pcap->msr_work);
147 }
148 
pcap_unmask_irq(struct irq_data * d)149 static void pcap_unmask_irq(struct irq_data *d)
150 {
151 	struct pcap_chip *pcap = irq_data_get_irq_chip_data(d);
152 
153 	pcap->msr &= ~(1 << irq_to_pcap(pcap, d->irq));
154 	queue_work(pcap->workqueue, &pcap->msr_work);
155 }
156 
157 static struct irq_chip pcap_irq_chip = {
158 	.name		= "pcap",
159 	.irq_disable	= pcap_mask_irq,
160 	.irq_mask	= pcap_mask_irq,
161 	.irq_unmask	= pcap_unmask_irq,
162 };
163 
pcap_msr_work(struct work_struct * work)164 static void pcap_msr_work(struct work_struct *work)
165 {
166 	struct pcap_chip *pcap = container_of(work, struct pcap_chip, msr_work);
167 
168 	ezx_pcap_write(pcap, PCAP_REG_MSR, pcap->msr);
169 }
170 
pcap_isr_work(struct work_struct * work)171 static void pcap_isr_work(struct work_struct *work)
172 {
173 	struct pcap_chip *pcap = container_of(work, struct pcap_chip, isr_work);
174 	struct pcap_platform_data *pdata = dev_get_platdata(&pcap->spi->dev);
175 	u32 msr, isr, int_sel, service;
176 	int irq;
177 
178 	do {
179 		ezx_pcap_read(pcap, PCAP_REG_MSR, &msr);
180 		ezx_pcap_read(pcap, PCAP_REG_ISR, &isr);
181 
182 		/* We can't service/ack irqs that are assigned to port 2 */
183 		if (!(pdata->config & PCAP_SECOND_PORT)) {
184 			ezx_pcap_read(pcap, PCAP_REG_INT_SEL, &int_sel);
185 			isr &= ~int_sel;
186 		}
187 
188 		ezx_pcap_write(pcap, PCAP_REG_MSR, isr | msr);
189 		ezx_pcap_write(pcap, PCAP_REG_ISR, isr);
190 
191 		service = isr & ~msr;
192 		for (irq = pcap->irq_base; service; service >>= 1, irq++) {
193 			if (service & 1)
194 				generic_handle_irq_safe(irq);
195 		}
196 		ezx_pcap_write(pcap, PCAP_REG_MSR, pcap->msr);
197 	} while (gpio_get_value(pdata->gpio));
198 }
199 
pcap_irq_handler(struct irq_desc * desc)200 static void pcap_irq_handler(struct irq_desc *desc)
201 {
202 	struct pcap_chip *pcap = irq_desc_get_handler_data(desc);
203 
204 	desc->irq_data.chip->irq_ack(&desc->irq_data);
205 	queue_work(pcap->workqueue, &pcap->isr_work);
206 }
207 
208 /* ADC */
pcap_set_ts_bits(struct pcap_chip * pcap,u32 bits)209 void pcap_set_ts_bits(struct pcap_chip *pcap, u32 bits)
210 {
211 	unsigned long flags;
212 	u32 tmp;
213 
214 	spin_lock_irqsave(&pcap->adc_lock, flags);
215 	ezx_pcap_read(pcap, PCAP_REG_ADC, &tmp);
216 	tmp &= ~(PCAP_ADC_TS_M_MASK | PCAP_ADC_TS_REF_LOWPWR);
217 	tmp |= bits & (PCAP_ADC_TS_M_MASK | PCAP_ADC_TS_REF_LOWPWR);
218 	ezx_pcap_write(pcap, PCAP_REG_ADC, tmp);
219 	spin_unlock_irqrestore(&pcap->adc_lock, flags);
220 }
221 EXPORT_SYMBOL_GPL(pcap_set_ts_bits);
222 
pcap_disable_adc(struct pcap_chip * pcap)223 static void pcap_disable_adc(struct pcap_chip *pcap)
224 {
225 	u32 tmp;
226 
227 	ezx_pcap_read(pcap, PCAP_REG_ADC, &tmp);
228 	tmp &= ~(PCAP_ADC_ADEN|PCAP_ADC_BATT_I_ADC|PCAP_ADC_BATT_I_POLARITY);
229 	ezx_pcap_write(pcap, PCAP_REG_ADC, tmp);
230 }
231 
pcap_adc_trigger(struct pcap_chip * pcap)232 static void pcap_adc_trigger(struct pcap_chip *pcap)
233 {
234 	unsigned long flags;
235 	u32 tmp;
236 	u8 head;
237 
238 	spin_lock_irqsave(&pcap->adc_lock, flags);
239 	head = pcap->adc_head;
240 	if (!pcap->adc_queue[head]) {
241 		/* queue is empty, save power */
242 		pcap_disable_adc(pcap);
243 		spin_unlock_irqrestore(&pcap->adc_lock, flags);
244 		return;
245 	}
246 	/* start conversion on requested bank, save TS_M bits */
247 	ezx_pcap_read(pcap, PCAP_REG_ADC, &tmp);
248 	tmp &= (PCAP_ADC_TS_M_MASK | PCAP_ADC_TS_REF_LOWPWR);
249 	tmp |= pcap->adc_queue[head]->flags | PCAP_ADC_ADEN;
250 
251 	if (pcap->adc_queue[head]->bank == PCAP_ADC_BANK_1)
252 		tmp |= PCAP_ADC_AD_SEL1;
253 
254 	ezx_pcap_write(pcap, PCAP_REG_ADC, tmp);
255 	spin_unlock_irqrestore(&pcap->adc_lock, flags);
256 	ezx_pcap_write(pcap, PCAP_REG_ADR, PCAP_ADR_ASC);
257 }
258 
pcap_adc_irq(int irq,void * _pcap)259 static irqreturn_t pcap_adc_irq(int irq, void *_pcap)
260 {
261 	struct pcap_chip *pcap = _pcap;
262 	struct pcap_adc_request *req;
263 	u16 res[2];
264 	u32 tmp;
265 
266 	spin_lock(&pcap->adc_lock);
267 	req = pcap->adc_queue[pcap->adc_head];
268 
269 	if (WARN(!req, "adc irq without pending request\n")) {
270 		spin_unlock(&pcap->adc_lock);
271 		return IRQ_HANDLED;
272 	}
273 
274 	/* read requested channels results */
275 	ezx_pcap_read(pcap, PCAP_REG_ADC, &tmp);
276 	tmp &= ~(PCAP_ADC_ADA1_MASK | PCAP_ADC_ADA2_MASK);
277 	tmp |= (req->ch[0] << PCAP_ADC_ADA1_SHIFT);
278 	tmp |= (req->ch[1] << PCAP_ADC_ADA2_SHIFT);
279 	ezx_pcap_write(pcap, PCAP_REG_ADC, tmp);
280 	ezx_pcap_read(pcap, PCAP_REG_ADR, &tmp);
281 	res[0] = (tmp & PCAP_ADR_ADD1_MASK) >> PCAP_ADR_ADD1_SHIFT;
282 	res[1] = (tmp & PCAP_ADR_ADD2_MASK) >> PCAP_ADR_ADD2_SHIFT;
283 
284 	pcap->adc_queue[pcap->adc_head] = NULL;
285 	pcap->adc_head = (pcap->adc_head + 1) & (PCAP_ADC_MAXQ - 1);
286 	spin_unlock(&pcap->adc_lock);
287 
288 	/* pass the results and release memory */
289 	req->callback(req->data, res);
290 	kfree(req);
291 
292 	/* trigger next conversion (if any) on queue */
293 	pcap_adc_trigger(pcap);
294 
295 	return IRQ_HANDLED;
296 }
297 
pcap_adc_async(struct pcap_chip * pcap,u8 bank,u32 flags,u8 ch[],void * callback,void * data)298 int pcap_adc_async(struct pcap_chip *pcap, u8 bank, u32 flags, u8 ch[],
299 						void *callback, void *data)
300 {
301 	struct pcap_adc_request *req;
302 	unsigned long irq_flags;
303 
304 	/* This will be freed after we have a result */
305 	req = kmalloc(sizeof(struct pcap_adc_request), GFP_KERNEL);
306 	if (!req)
307 		return -ENOMEM;
308 
309 	req->bank = bank;
310 	req->flags = flags;
311 	req->ch[0] = ch[0];
312 	req->ch[1] = ch[1];
313 	req->callback = callback;
314 	req->data = data;
315 
316 	spin_lock_irqsave(&pcap->adc_lock, irq_flags);
317 	if (pcap->adc_queue[pcap->adc_tail]) {
318 		spin_unlock_irqrestore(&pcap->adc_lock, irq_flags);
319 		kfree(req);
320 		return -EBUSY;
321 	}
322 	pcap->adc_queue[pcap->adc_tail] = req;
323 	pcap->adc_tail = (pcap->adc_tail + 1) & (PCAP_ADC_MAXQ - 1);
324 	spin_unlock_irqrestore(&pcap->adc_lock, irq_flags);
325 
326 	/* start conversion */
327 	pcap_adc_trigger(pcap);
328 
329 	return 0;
330 }
331 EXPORT_SYMBOL_GPL(pcap_adc_async);
332 
333 /* subdevs */
pcap_remove_subdev(struct device * dev,void * unused)334 static int pcap_remove_subdev(struct device *dev, void *unused)
335 {
336 	platform_device_unregister(to_platform_device(dev));
337 	return 0;
338 }
339 
pcap_add_subdev(struct pcap_chip * pcap,struct pcap_subdev * subdev)340 static int pcap_add_subdev(struct pcap_chip *pcap,
341 						struct pcap_subdev *subdev)
342 {
343 	struct platform_device *pdev;
344 	int ret;
345 
346 	pdev = platform_device_alloc(subdev->name, subdev->id);
347 	if (!pdev)
348 		return -ENOMEM;
349 
350 	pdev->dev.parent = &pcap->spi->dev;
351 	pdev->dev.platform_data = subdev->platform_data;
352 
353 	ret = platform_device_add(pdev);
354 	if (ret)
355 		platform_device_put(pdev);
356 
357 	return ret;
358 }
359 
ezx_pcap_remove(struct spi_device * spi)360 static void ezx_pcap_remove(struct spi_device *spi)
361 {
362 	struct pcap_chip *pcap = spi_get_drvdata(spi);
363 	unsigned long flags;
364 	int i;
365 
366 	/* remove all registered subdevs */
367 	device_for_each_child(&spi->dev, NULL, pcap_remove_subdev);
368 
369 	/* cleanup ADC */
370 	spin_lock_irqsave(&pcap->adc_lock, flags);
371 	for (i = 0; i < PCAP_ADC_MAXQ; i++)
372 		kfree(pcap->adc_queue[i]);
373 	spin_unlock_irqrestore(&pcap->adc_lock, flags);
374 
375 	/* cleanup irqchip */
376 	for (i = pcap->irq_base; i < (pcap->irq_base + PCAP_NIRQS); i++)
377 		irq_set_chip_and_handler(i, NULL, NULL);
378 
379 	destroy_workqueue(pcap->workqueue);
380 }
381 
ezx_pcap_probe(struct spi_device * spi)382 static int ezx_pcap_probe(struct spi_device *spi)
383 {
384 	struct pcap_platform_data *pdata = dev_get_platdata(&spi->dev);
385 	struct pcap_chip *pcap;
386 	int i, adc_irq;
387 	int ret = -ENODEV;
388 
389 	/* platform data is required */
390 	if (!pdata)
391 		goto ret;
392 
393 	pcap = devm_kzalloc(&spi->dev, sizeof(*pcap), GFP_KERNEL);
394 	if (!pcap) {
395 		ret = -ENOMEM;
396 		goto ret;
397 	}
398 
399 	spin_lock_init(&pcap->io_lock);
400 	spin_lock_init(&pcap->adc_lock);
401 	INIT_WORK(&pcap->isr_work, pcap_isr_work);
402 	INIT_WORK(&pcap->msr_work, pcap_msr_work);
403 	spi_set_drvdata(spi, pcap);
404 
405 	/* setup spi */
406 	spi->bits_per_word = 32;
407 	spi->mode = SPI_MODE_0 | (pdata->config & PCAP_CS_AH ? SPI_CS_HIGH : 0);
408 	ret = spi_setup(spi);
409 	if (ret)
410 		goto ret;
411 
412 	pcap->spi = spi;
413 
414 	/* setup irq */
415 	pcap->irq_base = pdata->irq_base;
416 	pcap->workqueue = create_singlethread_workqueue("pcapd");
417 	if (!pcap->workqueue) {
418 		ret = -ENOMEM;
419 		dev_err(&spi->dev, "can't create pcap thread\n");
420 		goto ret;
421 	}
422 
423 	/* redirect interrupts to AP, except adcdone2 */
424 	if (!(pdata->config & PCAP_SECOND_PORT))
425 		ezx_pcap_write(pcap, PCAP_REG_INT_SEL,
426 					(1 << PCAP_IRQ_ADCDONE2));
427 
428 	/* setup irq chip */
429 	for (i = pcap->irq_base; i < (pcap->irq_base + PCAP_NIRQS); i++) {
430 		irq_set_chip_and_handler(i, &pcap_irq_chip, handle_simple_irq);
431 		irq_set_chip_data(i, pcap);
432 		irq_clear_status_flags(i, IRQ_NOREQUEST | IRQ_NOPROBE);
433 	}
434 
435 	/* mask/ack all PCAP interrupts */
436 	ezx_pcap_write(pcap, PCAP_REG_MSR, PCAP_MASK_ALL_INTERRUPT);
437 	ezx_pcap_write(pcap, PCAP_REG_ISR, PCAP_CLEAR_INTERRUPT_REGISTER);
438 	pcap->msr = PCAP_MASK_ALL_INTERRUPT;
439 
440 	irq_set_irq_type(spi->irq, IRQ_TYPE_EDGE_RISING);
441 	irq_set_chained_handler_and_data(spi->irq, pcap_irq_handler, pcap);
442 	irq_set_irq_wake(spi->irq, 1);
443 
444 	/* ADC */
445 	adc_irq = pcap_to_irq(pcap, (pdata->config & PCAP_SECOND_PORT) ?
446 					PCAP_IRQ_ADCDONE2 : PCAP_IRQ_ADCDONE);
447 
448 	ret = devm_request_irq(&spi->dev, adc_irq, pcap_adc_irq, 0, "ADC",
449 				pcap);
450 	if (ret)
451 		goto free_irqchip;
452 
453 	/* setup subdevs */
454 	for (i = 0; i < pdata->num_subdevs; i++) {
455 		ret = pcap_add_subdev(pcap, &pdata->subdevs[i]);
456 		if (ret)
457 			goto remove_subdevs;
458 	}
459 
460 	/* board specific quirks */
461 	if (pdata->init)
462 		pdata->init(pcap);
463 
464 	return 0;
465 
466 remove_subdevs:
467 	device_for_each_child(&spi->dev, NULL, pcap_remove_subdev);
468 free_irqchip:
469 	for (i = pcap->irq_base; i < (pcap->irq_base + PCAP_NIRQS); i++)
470 		irq_set_chip_and_handler(i, NULL, NULL);
471 /* destroy_workqueue: */
472 	destroy_workqueue(pcap->workqueue);
473 ret:
474 	return ret;
475 }
476 
477 static struct spi_driver ezxpcap_driver = {
478 	.probe	= ezx_pcap_probe,
479 	.remove = ezx_pcap_remove,
480 	.driver = {
481 		.name	= "ezx-pcap",
482 	},
483 };
484 
ezx_pcap_init(void)485 static int __init ezx_pcap_init(void)
486 {
487 	return spi_register_driver(&ezxpcap_driver);
488 }
489 
ezx_pcap_exit(void)490 static void __exit ezx_pcap_exit(void)
491 {
492 	spi_unregister_driver(&ezxpcap_driver);
493 }
494 
495 subsys_initcall(ezx_pcap_init);
496 module_exit(ezx_pcap_exit);
497 
498 MODULE_AUTHOR("Daniel Ribeiro / Harald Welte");
499 MODULE_DESCRIPTION("Motorola PCAP2 ASIC Driver");
500 MODULE_ALIAS("spi:ezx-pcap");
501