Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Staging/iio/adc/touchscreen/MXS: add i.MX23 support to the LRADC touchscreen driver

Distinguish i.MX23 and i.MX28 at runtime and do the same for both SoC at least
for the 4 wire touchscreen.

Signed-off-by: Juergen Beisert <jbe@pengutronix.de>
Tested-by: Marek Vasut <marex@denx.de>
Acked-by: Marek Vasut <marex@denx.de>
Teseted-by: Lothar Waßmann <LW@KARO-electronics.de>
Signed-off-by: Jonathan Cameron <jic23@kernel.org>

CC: linux-arm-kernel@lists.infradead.org
CC: linux-input@vger.kernel.org
CC: devel@driverdev.osuosl.org
CC: Marek Vasut <marex@denx.de>
CC: Fabio Estevam <fabio.estevam@freescale.com>

authored by

Juergen Beisert and committed by
Jonathan Cameron
8c06f714 f0b83cc8

+55 -11
+55 -11
drivers/staging/iio/adc/mxs-lradc.c
··· 191 191 # define LRADC_CTRL0_MX28_XNPSW /* XM */ (1 << 17) 192 192 # define LRADC_CTRL0_MX28_XPPSW /* XP */ (1 << 16) 193 193 194 + # define LRADC_CTRL0_MX23_TOUCH_DETECT_ENABLE (1 << 20) 195 + # define LRADC_CTRL0_MX23_YM (1 << 19) 196 + # define LRADC_CTRL0_MX23_XM (1 << 18) 197 + # define LRADC_CTRL0_MX23_YP (1 << 17) 198 + # define LRADC_CTRL0_MX23_XP (1 << 16) 199 + 194 200 # define LRADC_CTRL0_MX28_PLATE_MASK \ 195 201 (LRADC_CTRL0_MX28_TOUCH_DETECT_ENABLE | \ 196 202 LRADC_CTRL0_MX28_YNNSW | LRADC_CTRL0_MX28_YPNSW | \ 197 203 LRADC_CTRL0_MX28_YPPSW | LRADC_CTRL0_MX28_XNNSW | \ 198 204 LRADC_CTRL0_MX28_XNPSW | LRADC_CTRL0_MX28_XPPSW) 199 205 206 + # define LRADC_CTRL0_MX23_PLATE_MASK \ 207 + (LRADC_CTRL0_MX23_TOUCH_DETECT_ENABLE | \ 208 + LRADC_CTRL0_MX23_YM | LRADC_CTRL0_MX23_XM | \ 209 + LRADC_CTRL0_MX23_YP | LRADC_CTRL0_MX23_XP) 210 + 200 211 #define LRADC_CTRL1 0x10 201 212 #define LRADC_CTRL1_TOUCH_DETECT_IRQ_EN (1 << 24) 202 213 #define LRADC_CTRL1_LRADC_IRQ_EN(n) (1 << ((n) + 16)) 203 214 #define LRADC_CTRL1_MX28_LRADC_IRQ_EN_MASK (0x1fff << 16) 215 + #define LRADC_CTRL1_MX23_LRADC_IRQ_EN_MASK (0x01ff << 16) 204 216 #define LRADC_CTRL1_LRADC_IRQ_EN_OFFSET 16 205 217 #define LRADC_CTRL1_TOUCH_DETECT_IRQ (1 << 8) 206 218 #define LRADC_CTRL1_LRADC_IRQ(n) (1 << (n)) 207 219 #define LRADC_CTRL1_MX28_LRADC_IRQ_MASK 0x1fff 220 + #define LRADC_CTRL1_MX23_LRADC_IRQ_MASK 0x01ff 208 221 #define LRADC_CTRL1_LRADC_IRQ_OFFSET 0 209 222 210 223 #define LRADC_CTRL2 0x20 ··· 268 255 269 256 static u32 mxs_lradc_plate_mask(struct mxs_lradc *lradc) 270 257 { 271 - return LRADC_CTRL0_MX28_PLATE_MASK; 258 + if (lradc->soc == IMX23_LRADC) 259 + return LRADC_CTRL0_MX23_PLATE_MASK; 260 + else 261 + return LRADC_CTRL0_MX28_PLATE_MASK; 272 262 } 273 263 274 264 static u32 mxs_lradc_irq_en_mask(struct mxs_lradc *lradc) 275 265 { 276 - return LRADC_CTRL1_MX28_LRADC_IRQ_EN_MASK; 266 + if (lradc->soc == IMX23_LRADC) 267 + return LRADC_CTRL1_MX23_LRADC_IRQ_EN_MASK; 268 + else 269 + return LRADC_CTRL1_MX28_LRADC_IRQ_EN_MASK; 277 270 } 278 271 279 272 static u32 mxs_lradc_irq_mask(struct mxs_lradc *lradc) 280 273 { 281 - return LRADC_CTRL1_MX28_LRADC_IRQ_MASK; 274 + if (lradc->soc == IMX23_LRADC) 275 + return LRADC_CTRL1_MX23_LRADC_IRQ_MASK; 276 + else 277 + return LRADC_CTRL1_MX28_LRADC_IRQ_MASK; 282 278 } 283 279 284 280 static u32 mxs_lradc_touch_detect_bit(struct mxs_lradc *lradc) 285 281 { 286 - return LRADC_CTRL0_MX28_TOUCH_DETECT_ENABLE; 282 + if (lradc->soc == IMX23_LRADC) 283 + return LRADC_CTRL0_MX23_TOUCH_DETECT_ENABLE; 284 + else 285 + return LRADC_CTRL0_MX28_TOUCH_DETECT_ENABLE; 287 286 } 288 287 289 288 static u32 mxs_lradc_drive_x_plate(struct mxs_lradc *lradc) 290 289 { 291 - return LRADC_CTRL0_MX28_XPPSW | LRADC_CTRL0_MX28_XNNSW; 290 + if (lradc->soc == IMX23_LRADC) 291 + return LRADC_CTRL0_MX23_XP | LRADC_CTRL0_MX23_XM; 292 + else 293 + return LRADC_CTRL0_MX28_XPPSW | LRADC_CTRL0_MX28_XNNSW; 292 294 } 293 295 294 296 static u32 mxs_lradc_drive_y_plate(struct mxs_lradc *lradc) 295 297 { 296 - return LRADC_CTRL0_MX28_YPPSW | LRADC_CTRL0_MX28_YNNSW; 298 + if (lradc->soc == IMX23_LRADC) 299 + return LRADC_CTRL0_MX23_YP | LRADC_CTRL0_MX23_YM; 300 + else 301 + return LRADC_CTRL0_MX28_YPPSW | LRADC_CTRL0_MX28_YNNSW; 297 302 } 298 303 299 304 static u32 mxs_lradc_drive_pressure(struct mxs_lradc *lradc) 300 305 { 301 - return LRADC_CTRL0_MX28_YPPSW | LRADC_CTRL0_MX28_XNNSW; 306 + if (lradc->soc == IMX23_LRADC) 307 + return LRADC_CTRL0_MX23_YP | LRADC_CTRL0_MX23_XM; 308 + else 309 + return LRADC_CTRL0_MX28_YPPSW | LRADC_CTRL0_MX28_XNNSW; 302 310 } 303 311 304 312 /* ··· 356 322 * Virtual channel 0 is always used here as the others are always not 357 323 * used if doing raw sampling. 358 324 */ 359 - mxs_lradc_reg_clear(lradc, LRADC_CTRL1_MX28_LRADC_IRQ_EN_MASK, 325 + if (lradc->soc == IMX28_LRADC) 326 + mxs_lradc_reg_clear(lradc, LRADC_CTRL1_MX28_LRADC_IRQ_EN_MASK, 360 327 LRADC_CTRL1); 361 328 mxs_lradc_reg_clear(lradc, 0xff, LRADC_CTRL0); 362 329 ··· 799 764 if (ret < 0) 800 765 goto err_buf; 801 766 802 - mxs_lradc_reg_clear(lradc, LRADC_CTRL1_MX28_LRADC_IRQ_EN_MASK, 767 + if (lradc->soc == IMX28_LRADC) 768 + mxs_lradc_reg_clear(lradc, LRADC_CTRL1_MX28_LRADC_IRQ_EN_MASK, 803 769 LRADC_CTRL1); 804 770 mxs_lradc_reg_clear(lradc, 0xff, LRADC_CTRL0); 805 771 ··· 838 802 LRADC_DELAY_KICK, LRADC_DELAY(0)); 839 803 840 804 mxs_lradc_reg_clear(lradc, 0xff, LRADC_CTRL0); 841 - mxs_lradc_reg_clear(lradc, LRADC_CTRL1_MX28_LRADC_IRQ_EN_MASK, 805 + if (lradc->soc == IMX28_LRADC) 806 + mxs_lradc_reg_clear(lradc, LRADC_CTRL1_MX28_LRADC_IRQ_EN_MASK, 842 807 LRADC_CTRL1); 843 808 844 809 kfree(lradc->buffer); ··· 943 906 mxs_lradc_reg_wrt(lradc, 0, LRADC_DELAY(3)); 944 907 945 908 /* Configure the touchscreen type */ 946 - mxs_lradc_reg_clear(lradc, LRADC_CTRL0_MX28_TOUCH_SCREEN_TYPE, 909 + if (lradc->soc == IMX28_LRADC) { 910 + mxs_lradc_reg_clear(lradc, LRADC_CTRL0_MX28_TOUCH_SCREEN_TYPE, 947 911 LRADC_CTRL0); 948 912 949 913 if (lradc->use_touchscreen == MXS_LRADC_TOUCHSCREEN_5WIRE) ··· 1032 994 else 1033 995 dev_warn(dev, "Unsupported number of touchscreen wires (%d)\n", 1034 996 ts_wires); 997 + 998 + if ((lradc->soc == IMX23_LRADC) && (ts_wires == 5)) { 999 + dev_warn(dev, "No support for 5 wire touches on i.MX23\n"); 1000 + dev_warn(dev, "Falling back to 4 wire\n"); 1001 + ts_wires = 4; 1002 + } 1035 1003 1036 1004 /* Grab all IRQ sources */ 1037 1005 for (i = 0; i < of_cfg->irq_count; i++) {