ti_am335x_adc.c 7.8 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
/*
 * TI ADC MFD driver
 *
 * Copyright (C) 2012 Texas Instruments Incorporated - http://www.ti.com/
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation version 2.
 *
 * This program is distributed "as is" WITHOUT ANY WARRANTY of any
 * kind, whether express or implied; without even the implied warranty
 * of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 */

#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/err.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/interrupt.h>
#include <linux/platform_device.h>
#include <linux/io.h>
#include <linux/iio/iio.h>
25 26
#include <linux/of.h>
#include <linux/of_device.h>
27 28
#include <linux/iio/machine.h>
#include <linux/iio/driver.h>
29 30 31 32 33 34

#include <linux/mfd/ti_am335x_tscadc.h>

struct tiadc_device {
	struct ti_tscadc_dev *mfd_tscadc;
	int channels;
35 36
	u8 channel_line[8];
	u8 channel_step[8];
37 38 39 40 41 42 43 44 45 46 47 48 49
};

static unsigned int tiadc_readl(struct tiadc_device *adc, unsigned int reg)
{
	return readl(adc->mfd_tscadc->tscadc_base + reg);
}

static void tiadc_writel(struct tiadc_device *adc, unsigned int reg,
					unsigned int val)
{
	writel(val, adc->mfd_tscadc->tscadc_base + reg);
}

50 51 52 53 54 55 56 57 58
static u32 get_adc_step_mask(struct tiadc_device *adc_dev)
{
	u32 step_en;

	step_en = ((1 << adc_dev->channels) - 1);
	step_en <<= TOTAL_STEPS - adc_dev->channels + 1;
	return step_en;
}

59 60 61
static void tiadc_step_config(struct tiadc_device *adc_dev)
{
	unsigned int stepconfig;
62
	int i, steps;
63
	u32 step_en;
64 65 66 67 68 69 70 71 72 73 74 75 76 77

	/*
	 * There are 16 configurable steps and 8 analog input
	 * lines available which are shared between Touchscreen and ADC.
	 *
	 * Steps backwards i.e. from 16 towards 0 are used by ADC
	 * depending on number of input lines needed.
	 * Channel would represent which analog input
	 * needs to be given to ADC to digitalize data.
	 */

	steps = TOTAL_STEPS - adc_dev->channels;
	stepconfig = STEPCONFIG_AVG_16 | STEPCONFIG_FIFO1;

78 79 80 81 82 83 84
	for (i = 0; i < adc_dev->channels; i++) {
		int chan;

		chan = adc_dev->channel_line[i];
		tiadc_writel(adc_dev, REG_STEPCONFIG(steps),
				stepconfig | STEPCONFIG_INP(chan));
		tiadc_writel(adc_dev, REG_STEPDELAY(steps),
85
				STEPCONFIG_OPENDLY);
86 87
		adc_dev->channel_step[i] = steps;
		steps++;
88
	}
89 90
	step_en = get_adc_step_mask(adc_dev);
	am335x_tsc_se_set(adc_dev->mfd_tscadc, step_en);
91 92
}

93 94 95 96 97 98 99 100 101 102 103
static const char * const chan_name_ain[] = {
	"AIN0",
	"AIN1",
	"AIN2",
	"AIN3",
	"AIN4",
	"AIN5",
	"AIN6",
	"AIN7",
};

104 105
static int tiadc_channel_init(struct iio_dev *indio_dev, int channels)
{
106
	struct tiadc_device *adc_dev = iio_priv(indio_dev);
107
	struct iio_chan_spec *chan_array;
108
	struct iio_chan_spec *chan;
109 110 111
	int i;

	indio_dev->num_channels = channels;
112
	chan_array = kcalloc(channels,
113 114 115 116
			sizeof(struct iio_chan_spec), GFP_KERNEL);
	if (chan_array == NULL)
		return -ENOMEM;

117 118 119
	chan = chan_array;
	for (i = 0; i < channels; i++, chan++) {

120 121
		chan->type = IIO_VOLTAGE;
		chan->indexed = 1;
122
		chan->channel = adc_dev->channel_line[i];
123
		chan->info_mask_separate = BIT(IIO_CHAN_INFO_RAW);
124
		chan->datasheet_name = chan_name_ain[chan->channel];
125 126 127
		chan->scan_type.sign = 'u';
		chan->scan_type.realbits = 12;
		chan->scan_type.storagebits = 32;
128 129 130 131
	}

	indio_dev->channels = chan_array;

132
	return 0;
133 134 135 136 137 138 139 140 141 142 143 144 145
}

static void tiadc_channels_remove(struct iio_dev *indio_dev)
{
	kfree(indio_dev->channels);
}

static int tiadc_read_raw(struct iio_dev *indio_dev,
		struct iio_chan_spec const *chan,
		int *val, int *val2, long mask)
{
	struct tiadc_device *adc_dev = iio_priv(indio_dev);
	int i;
146 147
	unsigned int fifo1count, read;
	u32 step = UINT_MAX;
148
	bool found = false;
149 150 151 152 153 154 155 156 157 158 159 160

	/*
	 * When the sub-system is first enabled,
	 * the sequencer will always start with the
	 * lowest step (1) and continue until step (16).
	 * For ex: If we have enabled 4 ADC channels and
	 * currently use only 1 out of them, the
	 * sequencer still configures all the 4 steps,
	 * leading to 3 unwanted data.
	 * Hence we need to flush out this data.
	 */

161 162 163 164 165 166 167 168 169
	for (i = 0; i < ARRAY_SIZE(adc_dev->channel_step); i++) {
		if (chan->channel == adc_dev->channel_line[i]) {
			step = adc_dev->channel_step[i];
			break;
		}
	}
	if (WARN_ON_ONCE(step == UINT_MAX))
		return -EINVAL;

170 171
	fifo1count = tiadc_readl(adc_dev, REG_FIFO1CNT);
	for (i = 0; i < fifo1count; i++) {
172
		read = tiadc_readl(adc_dev, REG_FIFO1);
173
		if (read >> 16 == step) {
174
			*val = read & 0xfff;
175 176
			found = true;
		}
177
	}
178
	am335x_tsc_se_update(adc_dev->mfd_tscadc);
179 180
	if (found == false)
		return -EBUSY;
181 182 183 184 185
	return IIO_VAL_INT;
}

static const struct iio_info tiadc_info = {
	.read_raw = &tiadc_read_raw,
186
	.driver_module = THIS_MODULE,
187 188
};

189
static int tiadc_probe(struct platform_device *pdev)
190 191 192
{
	struct iio_dev		*indio_dev;
	struct tiadc_device	*adc_dev;
193
	struct device_node	*node = pdev->dev.of_node;
194 195
	struct property		*prop;
	const __be32		*cur;
196
	int			err;
197 198
	u32			val;
	int			channels = 0;
199

200 201
	if (!node) {
		dev_err(&pdev->dev, "Could not find valid DT data.\n");
202 203 204 205 206 207 208 209 210 211 212
		return -EINVAL;
	}

	indio_dev = iio_device_alloc(sizeof(struct tiadc_device));
	if (indio_dev == NULL) {
		dev_err(&pdev->dev, "failed to allocate iio device\n");
		err = -ENOMEM;
		goto err_ret;
	}
	adc_dev = iio_priv(indio_dev);

213 214
	adc_dev->mfd_tscadc = ti_tscadc_dev_get(pdev);

215 216 217 218 219
	of_property_for_each_u32(node, "ti,adc-channels", prop, cur, val) {
		adc_dev->channel_line[channels] = val;
		channels++;
	}
	adc_dev->channels = channels;
220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247

	indio_dev->dev.parent = &pdev->dev;
	indio_dev->name = dev_name(&pdev->dev);
	indio_dev->modes = INDIO_DIRECT_MODE;
	indio_dev->info = &tiadc_info;

	tiadc_step_config(adc_dev);

	err = tiadc_channel_init(indio_dev, adc_dev->channels);
	if (err < 0)
		goto err_free_device;

	err = iio_device_register(indio_dev);
	if (err)
		goto err_free_channels;

	platform_set_drvdata(pdev, indio_dev);

	return 0;

err_free_channels:
	tiadc_channels_remove(indio_dev);
err_free_device:
	iio_device_free(indio_dev);
err_ret:
	return err;
}

248
static int tiadc_remove(struct platform_device *pdev)
249 250
{
	struct iio_dev *indio_dev = platform_get_drvdata(pdev);
251 252
	struct tiadc_device *adc_dev = iio_priv(indio_dev);
	u32 step_en;
253 254 255 256

	iio_device_unregister(indio_dev);
	tiadc_channels_remove(indio_dev);

257 258 259
	step_en = get_adc_step_mask(adc_dev);
	am335x_tsc_se_clr(adc_dev->mfd_tscadc, step_en);

260 261 262 263 264 265 266 267 268 269
	iio_device_free(indio_dev);

	return 0;
}

#ifdef CONFIG_PM
static int tiadc_suspend(struct device *dev)
{
	struct iio_dev *indio_dev = dev_get_drvdata(dev);
	struct tiadc_device *adc_dev = iio_priv(indio_dev);
270
	struct ti_tscadc_dev *tscadc_dev;
271 272
	unsigned int idle;

273
	tscadc_dev = ti_tscadc_dev_get(to_platform_device(dev));
274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308
	if (!device_may_wakeup(tscadc_dev->dev)) {
		idle = tiadc_readl(adc_dev, REG_CTRL);
		idle &= ~(CNTRLREG_TSCSSENB);
		tiadc_writel(adc_dev, REG_CTRL, (idle |
				CNTRLREG_POWERDOWN));
	}

	return 0;
}

static int tiadc_resume(struct device *dev)
{
	struct iio_dev *indio_dev = dev_get_drvdata(dev);
	struct tiadc_device *adc_dev = iio_priv(indio_dev);
	unsigned int restore;

	/* Make sure ADC is powered up */
	restore = tiadc_readl(adc_dev, REG_CTRL);
	restore &= ~(CNTRLREG_POWERDOWN);
	tiadc_writel(adc_dev, REG_CTRL, restore);

	tiadc_step_config(adc_dev);

	return 0;
}

static const struct dev_pm_ops tiadc_pm_ops = {
	.suspend = tiadc_suspend,
	.resume = tiadc_resume,
};
#define TIADC_PM_OPS (&tiadc_pm_ops)
#else
#define TIADC_PM_OPS NULL
#endif

309 310 311 312 313 314
static const struct of_device_id ti_adc_dt_ids[] = {
	{ .compatible = "ti,am3359-adc", },
	{ }
};
MODULE_DEVICE_TABLE(of, ti_adc_dt_ids);

315 316
static struct platform_driver tiadc_driver = {
	.driver = {
317
		.name   = "TI-am335x-adc",
318 319
		.owner	= THIS_MODULE,
		.pm	= TIADC_PM_OPS,
320
		.of_match_table = of_match_ptr(ti_adc_dt_ids),
321 322
	},
	.probe	= tiadc_probe,
323
	.remove	= tiadc_remove,
324 325 326 327 328 329
};
module_platform_driver(tiadc_driver);

MODULE_DESCRIPTION("TI ADC controller driver");
MODULE_AUTHOR("Rachna Patil <rachna@ti.com>");
MODULE_LICENSE("GPL");