summaryrefslogtreecommitdiffstats
path: root/drivers/mfd/ti_am335x_tscadc.c
diff options
context:
space:
mode:
authorPantelis Antoniou <panto@antoniou-consulting.com>2012-10-13 16:37:24 +0300
committerSebastian Andrzej Siewior <bigeasy@linutronix.de>2013-06-12 18:50:20 +0200
commit24d5c82f8227d4dedf177df3f062eb35db15aaf6 (patch)
treecf0c88f77864ec2c467adbaf53e9ddd3c4cb57a2 /drivers/mfd/ti_am335x_tscadc.c
parentc80df483f61d0464224dc4386ced470c7275d78f (diff)
downloadlinux-stable-24d5c82f8227d4dedf177df3f062eb35db15aaf6.tar.gz
linux-stable-24d5c82f8227d4dedf177df3f062eb35db15aaf6.tar.bz2
linux-stable-24d5c82f8227d4dedf177df3f062eb35db15aaf6.zip
mfd: ti_tscadc: deal with partial activation
Fix the mfd device in the case where a subdevice might not be activated. Signed-off-by: Pantelis Antoniou <panto@antoniou-consulting.com> Signed-off-by: Felipe Balbi <balbi@ti.com> Signed-off-by: Sebastian Andrzej Siewior <bigeasy@linutronix.de>
Diffstat (limited to 'drivers/mfd/ti_am335x_tscadc.c')
-rw-r--r--drivers/mfd/ti_am335x_tscadc.c38
1 files changed, 25 insertions, 13 deletions
diff --git a/drivers/mfd/ti_am335x_tscadc.c b/drivers/mfd/ti_am335x_tscadc.c
index e78b9df590c0..d05fcba6f13a 100644
--- a/drivers/mfd/ti_am335x_tscadc.c
+++ b/drivers/mfd/ti_am335x_tscadc.c
@@ -107,11 +107,14 @@ static int ti_tscadc_probe(struct platform_device *pdev)
of_property_read_u32(node, "ti,adc-channels", &adc_channels);
total_channels = tsc_wires + adc_channels;
-
if (total_channels > 8) {
dev_err(&pdev->dev, "Number of i/p channels more than 8\n");
return -EINVAL;
}
+ if (total_channels == 0) {
+ dev_err(&pdev->dev, "Need atleast one channel.\n");
+ return -EINVAL;
+ }
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
if (!res) {
@@ -202,28 +205,37 @@ static int ti_tscadc_probe(struct platform_device *pdev)
ctrl |= CNTRLREG_TSCSSENB;
tscadc_writel(tscadc, REG_CTRL, ctrl);
+ tscadc->used_cells = 0;
+ tscadc->tsc_cell = -1;
+ tscadc->adc_cell = -1;
+
/* TSC Cell */
- cell = &tscadc->cells[TSC_CELL];
- cell->name = "tsc";
- cell->of_compatible = "ti,am3359-tsc";
- cell->platform_data = &tscadc;
- cell->pdata_size = sizeof(tscadc);
+ if (tsc_wires > 0) {
+ tscadc->tsc_cell = tscadc->used_cells;
+ cell = &tscadc->cells[tscadc->used_cells++];
+ cell->name = "tsc";
+ cell->of_compatible = "ti,am3359-tsc";
+ cell->platform_data = &tscadc;
+ cell->pdata_size = sizeof(tscadc);
+ }
/* ADC Cell */
- cell = &tscadc->cells[ADC_CELL];
- cell->name = "tiadc";
- cell->of_compatible = "ti,am3359-adc";
- cell->platform_data = &tscadc;
- cell->pdata_size = sizeof(tscadc);
+ if (adc_channels > 0) {
+ tscadc->adc_cell = tscadc->used_cells;
+ cell = &tscadc->cells[tscadc->used_cells++];
+ cell->name = "tiadc";
+ cell->of_compatible = "ti,am3359-adc";
+ cell->platform_data = &tscadc;
+ cell->pdata_size = sizeof(tscadc);
+ }
err = mfd_add_devices(&pdev->dev, pdev->id, tscadc->cells,
- TSCADC_CELLS, NULL, 0, NULL);
+ tscadc->used_cells, NULL, 0, NULL);
if (err < 0)
goto err_disable_clk;
device_init_wakeup(&pdev->dev, true);
platform_set_drvdata(pdev, tscadc);
-
return 0;
err_disable_clk: