aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/input
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/input')
-rw-r--r--drivers/input/touchscreen/88pm860x-ts.c91
1 files changed, 85 insertions, 6 deletions
diff --git a/drivers/input/touchscreen/88pm860x-ts.c b/drivers/input/touchscreen/88pm860x-ts.c
index 4f81e6eb74b..326218dbd6e 100644
--- a/drivers/input/touchscreen/88pm860x-ts.c
+++ b/drivers/input/touchscreen/88pm860x-ts.c
@@ -116,9 +116,13 @@ static void pm860x_touch_close(struct input_dev *dev)
116 116
117#ifdef CONFIG_OF 117#ifdef CONFIG_OF
118static int __devinit pm860x_touch_dt_init(struct platform_device *pdev, 118static int __devinit pm860x_touch_dt_init(struct platform_device *pdev,
119 struct pm860x_chip *chip,
119 int *res_x) 120 int *res_x)
120{ 121{
121 struct device_node *np = pdev->dev.parent->of_node; 122 struct device_node *np = pdev->dev.parent->of_node;
123 struct i2c_client *i2c = (chip->id == CHIP_PM8607) ? chip->client \
124 : chip->companion;
125 int data, n, ret;
122 if (!np) 126 if (!np)
123 return -ENODEV; 127 return -ENODEV;
124 np = of_find_node_by_name(np, "touch"); 128 np = of_find_node_by_name(np, "touch");
@@ -126,11 +130,43 @@ static int __devinit pm860x_touch_dt_init(struct platform_device *pdev,
126 dev_err(&pdev->dev, "Can't find touch node\n"); 130 dev_err(&pdev->dev, "Can't find touch node\n");
127 return -EINVAL; 131 return -EINVAL;
128 } 132 }
133 /* set GPADC MISC1 register */
134 data = 0;
135 if (!of_property_read_u32(np, "marvell,88pm860x-gpadc-prebias", &n))
136 data |= (n << 1) & PM8607_GPADC_PREBIAS_MASK;
137 if (!of_property_read_u32(np, "marvell,88pm860x-gpadc-slot-cycle", &n))
138 data |= (n << 3) & PM8607_GPADC_SLOT_CYCLE_MASK;
139 if (!of_property_read_u32(np, "marvell,88pm860x-gpadc-off-scale", &n))
140 data |= (n << 5) & PM8607_GPADC_OFF_SCALE_MASK;
141 if (!of_property_read_u32(np, "marvell,88pm860x-gpadc-sw-cal", &n))
142 data |= (n << 7) & PM8607_GPADC_SW_CAL_MASK;
143 if (data) {
144 ret = pm860x_reg_write(i2c, PM8607_GPADC_MISC1, data);
145 if (ret < 0)
146 return -EINVAL;
147 }
148 /* set tsi prebias time */
149 if (!of_property_read_u32(np, "marvell,88pm860x-tsi-prebias", &data)) {
150 ret = pm860x_reg_write(i2c, PM8607_TSI_PREBIAS, data);
151 if (ret < 0)
152 return -EINVAL;
153 }
154 /* set prebias & prechg time of pen detect */
155 data = 0;
156 if (!of_property_read_u32(np, "marvell,88pm860x-pen-prebias", &n))
157 data |= n & PM8607_PD_PREBIAS_MASK;
158 if (!of_property_read_u32(np, "marvell,88pm860x-pen-prechg", &n))
159 data |= n & PM8607_PD_PRECHG_MASK;
160 if (data) {
161 ret = pm860x_reg_write(i2c, PM8607_PD_PREBIAS, data);
162 if (ret < 0)
163 return -EINVAL;
164 }
129 of_property_read_u32(np, "marvell,88pm860x-resistor-X", res_x); 165 of_property_read_u32(np, "marvell,88pm860x-resistor-X", res_x);
130 return 0; 166 return 0;
131} 167}
132#else 168#else
133#define pm860x_touch_dt_init(x, y) (-1) 169#define pm860x_touch_dt_init(x, y, z) (-1)
134#endif 170#endif
135 171
136static int __devinit pm860x_touch_probe(struct platform_device *pdev) 172static int __devinit pm860x_touch_probe(struct platform_device *pdev)
@@ -138,7 +174,9 @@ static int __devinit pm860x_touch_probe(struct platform_device *pdev)
138 struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent); 174 struct pm860x_chip *chip = dev_get_drvdata(pdev->dev.parent);
139 struct pm860x_touch_pdata *pdata = pdev->dev.platform_data; 175 struct pm860x_touch_pdata *pdata = pdev->dev.platform_data;
140 struct pm860x_touch *touch; 176 struct pm860x_touch *touch;
141 int irq, ret, res_x = 0; 177 struct i2c_client *i2c = (chip->id == CHIP_PM8607) ? chip->client \
178 : chip->companion;
179 int irq, ret, res_x = 0, data = 0;
142 180
143 irq = platform_get_irq(pdev, 0); 181 irq = platform_get_irq(pdev, 0);
144 if (irq < 0) { 182 if (irq < 0) {
@@ -146,14 +184,55 @@ static int __devinit pm860x_touch_probe(struct platform_device *pdev)
146 return -EINVAL; 184 return -EINVAL;
147 } 185 }
148 186
149 if (pm860x_touch_dt_init(pdev, &res_x)) { 187 if (pm860x_touch_dt_init(pdev, chip, &res_x)) {
150 if (pdata) 188 if (pdata) {
189 /* set GPADC MISC1 register */
190 data = 0;
191 data |= (pdata->gpadc_prebias << 1)
192 & PM8607_GPADC_PREBIAS_MASK;
193 data |= (pdata->slot_cycle << 3)
194 & PM8607_GPADC_SLOT_CYCLE_MASK;
195 data |= (pdata->off_scale << 5)
196 & PM8607_GPADC_OFF_SCALE_MASK;
197 data |= (pdata->sw_cal << 7)
198 & PM8607_GPADC_SW_CAL_MASK;
199 if (data) {
200 ret = pm860x_reg_write(i2c,
201 PM8607_GPADC_MISC1, data);
202 if (ret < 0)
203 return -EINVAL;
204 }
205 /* set tsi prebias time */
206 if (pdata->tsi_prebias) {
207 data = pdata->tsi_prebias;
208 ret = pm860x_reg_write(i2c,
209 PM8607_TSI_PREBIAS, data);
210 if (ret < 0)
211 return -EINVAL;
212 }
213 /* set prebias & prechg time of pen detect */
214 data = 0;
215 data |= pdata->pen_prebias
216 & PM8607_PD_PREBIAS_MASK;
217 data |= (pdata->pen_prechg << 5)
218 & PM8607_PD_PRECHG_MASK;
219 if (data) {
220 ret = pm860x_reg_write(i2c,
221 PM8607_PD_PREBIAS, data);
222 if (ret < 0)
223 return -EINVAL;
224 }
151 res_x = pdata->res_x; 225 res_x = pdata->res_x;
152 else { 226 } else {
153 dev_err(&pdev->dev, "failed to get platform data\n"); 227 dev_err(&pdev->dev, "failed to get platform data\n");
154 return -EINVAL; 228 return -EINVAL;
155 } 229 }
156 } 230 }
231 /* enable GPADC */
232 ret = pm860x_set_bits(i2c, PM8607_GPADC_MISC1, PM8607_GPADC_EN,
233 PM8607_GPADC_EN);
234 if (ret)
235 return ret;
157 236
158 touch = kzalloc(sizeof(struct pm860x_touch), GFP_KERNEL); 237 touch = kzalloc(sizeof(struct pm860x_touch), GFP_KERNEL);
159 if (touch == NULL) 238 if (touch == NULL)
@@ -174,7 +253,7 @@ static int __devinit pm860x_touch_probe(struct platform_device *pdev)
174 touch->idev->open = pm860x_touch_open; 253 touch->idev->open = pm860x_touch_open;
175 touch->idev->close = pm860x_touch_close; 254 touch->idev->close = pm860x_touch_close;
176 touch->chip = chip; 255 touch->chip = chip;
177 touch->i2c = (chip->id == CHIP_PM8607) ? chip->client : chip->companion; 256 touch->i2c = i2c;
178 touch->irq = irq; 257 touch->irq = irq;
179 touch->res_x = res_x; 258 touch->res_x = res_x;
180 input_set_drvdata(touch->idev, touch); 259 input_set_drvdata(touch->idev, touch);