xref: /openbmc/linux/arch/sh/kernel/cpu/adc.c (revision 498495dba268b20e8eadd7fe93c140c68b6cc9d2)
1*b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  * linux/arch/sh/kernel/adc.c -- SH3 on-chip ADC support
41da177e4SLinus Torvalds  *
51da177e4SLinus Torvalds  *  Copyright (C) 2004  Andriy Skulysh <askulysh@image.kiev.ua>
61da177e4SLinus Torvalds  */
71da177e4SLinus Torvalds 
81da177e4SLinus Torvalds #include <linux/module.h>
91da177e4SLinus Torvalds #include <asm/adc.h>
101da177e4SLinus Torvalds #include <asm/io.h>
111da177e4SLinus Torvalds 
121da177e4SLinus Torvalds 
adc_single(unsigned int channel)131da177e4SLinus Torvalds int adc_single(unsigned int channel)
141da177e4SLinus Torvalds {
151da177e4SLinus Torvalds 	int off;
161da177e4SLinus Torvalds 	unsigned char csr;
171da177e4SLinus Torvalds 
181da177e4SLinus Torvalds 	if (channel >= 8) return -1;
191da177e4SLinus Torvalds 
201da177e4SLinus Torvalds 	off = (channel & 0x03) << 2;
211da177e4SLinus Torvalds 
229d56dd3bSPaul Mundt 	csr = __raw_readb(ADCSR);
231da177e4SLinus Torvalds 	csr = channel | ADCSR_ADST | ADCSR_CKS;
249d56dd3bSPaul Mundt 	__raw_writeb(csr, ADCSR);
251da177e4SLinus Torvalds 
261da177e4SLinus Torvalds 	do {
279d56dd3bSPaul Mundt 		csr = __raw_readb(ADCSR);
281da177e4SLinus Torvalds 	} while ((csr & ADCSR_ADF) == 0);
291da177e4SLinus Torvalds 
301da177e4SLinus Torvalds 	csr &= ~(ADCSR_ADF | ADCSR_ADST);
319d56dd3bSPaul Mundt 	__raw_writeb(csr, ADCSR);
321da177e4SLinus Torvalds 
339d56dd3bSPaul Mundt 	return (((__raw_readb(ADDRAH + off) << 8) |
349d56dd3bSPaul Mundt 		__raw_readb(ADDRAL + off)) >> 6);
351da177e4SLinus Torvalds }
361da177e4SLinus Torvalds 
371da177e4SLinus Torvalds EXPORT_SYMBOL(adc_single);
38