···6677Required properties:88- compatible : shall be one of the following:99+ "atmel,at91sam9x5-sckc":1010+ at91 SCKC (Slow Clock Controller)1111+ This node contains the slow clock definitions.1212+1313+ "atmel,at91sam9x5-clk-slow-osc":1414+ at91 slow oscillator1515+1616+ "atmel,at91sam9x5-clk-slow-rc-osc":1717+ at91 internal slow RC oscillator1818+919 "atmel,at91rm9200-pmc" or1020 "atmel,at91sam9g45-pmc" or1121 "atmel,at91sam9n12-pmc" or···2515 All at91 specific clocks (clocks defined below) must be child2616 node of the PMC node.27171818+ "atmel,at91sam9x5-clk-slow" (under sckc node)1919+ or2020+ "atmel,at91sam9260-clk-slow" (under pmc node):2121+ at91 slow clk2222+2323+ "atmel,at91rm9200-clk-main-osc"2424+ "atmel,at91sam9x5-clk-main-rc-osc"2525+ at91 main clk sources2626+2727+ "atmel,at91sam9x5-clk-main"2828 "atmel,at91rm9200-clk-main":2929- at91 main oscillator2929+ at91 main clock30303131 "atmel,at91rm9200-clk-master" or3232 "atmel,at91sam9x5-clk-master":···7454 "atmel,at91sam9x5-clk-utmi":7555 at91 utmi clock76565757+Required properties for SCKC node:5858+- reg : defines the IO memory reserved for the SCKC.5959+- #size-cells : shall be 0 (reg is used to encode clk id).6060+- #address-cells : shall be 1 (reg is used to encode clk id).6161+6262+6363+For example:6464+ sckc: sckc@fffffe50 {6565+ compatible = "atmel,sama5d3-pmc";6666+ reg = <0xfffffe50 0x4>6767+ #size-cells = <0>;6868+ #address-cells = <1>;6969+7070+ /* put at91 slow clocks here */7171+ };7272+7373+7474+Required properties for internal slow RC oscillator:7575+- #clock-cells : from common clock binding; shall be set to 0.7676+- clock-frequency : define the internal RC oscillator frequency.7777+7878+Optional properties:7979+- clock-accuracy : define the internal RC oscillator accuracy.8080+8181+For example:8282+ slow_rc_osc: slow_rc_osc {8383+ compatible = "atmel,at91sam9x5-clk-slow-rc-osc";8484+ clock-frequency = <32768>;8585+ clock-accuracy = <50000000>;8686+ };8787+8888+Required properties for slow oscillator:8989+- #clock-cells : from common clock binding; shall be set to 0.9090+- clocks : shall encode the main osc source clk sources (see atmel datasheet).9191+9292+Optional properties:9393+- atmel,osc-bypass : boolean property. Set this when a clock signal is directly9494+ provided on XIN.9595+9696+For example:9797+ slow_osc: slow_osc {9898+ compatible = "atmel,at91rm9200-clk-slow-osc";9999+ #clock-cells = <0>;100100+ clocks = <&slow_xtal>;101101+ };102102+103103+Required properties for slow clock:104104+- #clock-cells : from common clock binding; shall be set to 0.105105+- clocks : shall encode the slow clk sources (see atmel datasheet).106106+107107+For example:108108+ clk32k: slck {109109+ compatible = "atmel,at91sam9x5-clk-slow";110110+ #clock-cells = <0>;111111+ clocks = <&slow_rc_osc &slow_osc>;112112+ };113113+77114Required properties for PMC node:78115- reg : defines the IO memory reserved for the PMC.79116- #size-cells : shall be 0 (reg is used to encode clk id).···16285 /* put at91 clocks here */16386 };164878888+Required properties for main clock internal RC oscillator:8989+- interrupt-parent : must reference the PMC node.9090+- interrupts : shall be set to "<0>".9191+- clock-frequency : define the internal RC oscillator frequency.9292+9393+Optional properties:9494+- clock-accuracy : define the internal RC oscillator accuracy.9595+9696+For example:9797+ main_rc_osc: main_rc_osc {9898+ compatible = "atmel,at91sam9x5-clk-main-rc-osc";9999+ interrupt-parent = <&pmc>;100100+ interrupts = <0>;101101+ clock-frequency = <12000000>;102102+ clock-accuracy = <50000000>;103103+ };104104+105105+Required properties for main clock oscillator:106106+- interrupt-parent : must reference the PMC node.107107+- interrupts : shall be set to "<0>".108108+- #clock-cells : from common clock binding; shall be set to 0.109109+- clocks : shall encode the main osc source clk sources (see atmel datasheet).110110+111111+Optional properties:112112+- atmel,osc-bypass : boolean property. Specified if a clock signal is provided113113+ on XIN.114114+115115+ clock signal is directly provided on XIN pin.116116+117117+For example:118118+ main_osc: main_osc {119119+ compatible = "atmel,at91rm9200-clk-main-osc";120120+ interrupt-parent = <&pmc>;121121+ interrupts = <0>;122122+ #clock-cells = <0>;123123+ clocks = <&main_xtal>;124124+ };125125+165126Required properties for main clock:166127- interrupt-parent : must reference the PMC node.167128- interrupts : shall be set to "<0>".168129- #clock-cells : from common clock binding; shall be set to 0.169169-- clocks (optional if clock-frequency is provided) : shall be the slow clock170170- phandle. This clock is used to calculate the main clock rate if171171- "clock-frequency" is not provided.172172-- clock-frequency : the main oscillator frequency.Prefer the use of173173- "clock-frequency" over automatic clock rate calculation.130130+- clocks : shall encode the main clk sources (see atmel datasheet).174131175132For example:176133 main: mainck {177177- compatible = "atmel,at91rm9200-clk-main";134134+ compatible = "atmel,at91sam9x5-clk-main";178135 interrupt-parent = <&pmc>;179136 interrupts = <0>;180137 #clock-cells = <0>;181181- clocks = <&ck32k>;182182- clock-frequency = <18432000>;138138+ clocks = <&main_rc_osc &main_osc>;183139 };184140185141Required properties for master clock:
···8383# CONFIG_INPUT_MOUSE is not set8484CONFIG_INPUT_TOUCHSCREEN=y8585CONFIG_TOUCHSCREEN_ATMEL_MXT=m8686-CONFIG_TOUCHSCREEN_ATMEL_TSADCC=y8786# CONFIG_SERIO is not set8887# CONFIG_LEGACY_PTYS is not set8988CONFIG_SERIAL_ATMEL=y···145146CONFIG_AT_HDMAC=y146147CONFIG_DMATEST=m147148# CONFIG_IOMMU_SUPPORT is not set149149+CONFIG_IIO=y150150+CONFIG_AT91_ADC=y148151CONFIG_EXT4_FS=y149152CONFIG_FANOTIFY=y150153CONFIG_VFAT_FS=y
+2-1
arch/arm/configs/at91sam9rl_defconfig
···4545# CONFIG_INPUT_KEYBOARD is not set4646# CONFIG_INPUT_MOUSE is not set4747CONFIG_INPUT_TOUCHSCREEN=y4848-CONFIG_TOUCHSCREEN_ATMEL_TSADCC=y4948# CONFIG_SERIO is not set5049CONFIG_SERIAL_ATMEL=y5150CONFIG_SERIAL_ATMEL_CONSOLE=y···6465CONFIG_MMC_ATMELMCI=m6566CONFIG_RTC_CLASS=y6667CONFIG_RTC_DRV_AT91SAM9=y6868+CONFIG_IIO=y6969+CONFIG_AT91_ADC=y6770CONFIG_EXT2_FS=y6871CONFIG_MSDOS_FS=y6972CONFIG_VFAT_FS=y
-1
arch/arm/configs/sama5_defconfig
···122122# CONFIG_INPUT_MOUSE is not set123123CONFIG_INPUT_TOUCHSCREEN=y124124CONFIG_TOUCHSCREEN_ATMEL_MXT=y125125-CONFIG_TOUCHSCREEN_ATMEL_TSADCC=y126125# CONFIG_SERIO is not set127126CONFIG_LEGACY_PTY_COUNT=4128127CONFIG_SERIAL_ATMEL=y
···4747#include "board.h"4848#include "sam9_smc.h"4949#include "generic.h"5050+#include "gpio.h"50515152/*5253 * The FOX Board G20 hardware comes as the "Netus G20" board with
···104104/* Clocks */105105#define AT91_SLOW_CLOCK 32768 /* slow clock */106106107107+/*108108+ * FIXME: this is needed to communicate between the pinctrl driver and109109+ * the PM implementation in the machine. Possibly part of the PM110110+ * implementation should be moved down into the pinctrl driver and get111111+ * called as part of the generic suspend/resume path.112112+ */113113+#ifndef __ASSEMBLY__114114+#ifdef CONFIG_PINCTRL_AT91115115+extern void at91_pinctrl_gpio_suspend(void);116116+extern void at91_pinctrl_gpio_resume(void);117117+#else118118+static inline void at91_pinctrl_gpio_suspend(void) {}119119+static inline void at91_pinctrl_gpio_resume(void) {}120120+#endif121121+#endif107122108123#endif
···3232#include "at91_aic.h"3333#include "generic.h"3434#include "pm.h"3535+#include "gpio.h"35363637/*3738 * Show the reason for the previous system reset.
···11+/*22+ * drivers/clk/at91/sckc.c33+ *44+ * Copyright (C) 2013 Boris BREZILLON <b.brezillon@overkiz.com>55+ *66+ * This program is free software; you can redistribute it and/or modify77+ * it under the terms of the GNU General Public License as published by88+ * the Free Software Foundation; either version 2 of the License, or99+ * (at your option) any later version.1010+ *1111+ */1212+1313+#include <linux/clk-provider.h>1414+#include <linux/clkdev.h>1515+#include <linux/of.h>1616+#include <linux/of_address.h>1717+#include <linux/io.h>1818+1919+#include "sckc.h"2020+2121+static const struct of_device_id sckc_clk_ids[] __initconst = {2222+ /* Slow clock */2323+ {2424+ .compatible = "atmel,at91sam9x5-clk-slow-osc",2525+ .data = of_at91sam9x5_clk_slow_osc_setup,2626+ },2727+ {2828+ .compatible = "atmel,at91sam9x5-clk-slow-rc-osc",2929+ .data = of_at91sam9x5_clk_slow_rc_osc_setup,3030+ },3131+ {3232+ .compatible = "atmel,at91sam9x5-clk-slow",3333+ .data = of_at91sam9x5_clk_slow_setup,3434+ },3535+ { /*sentinel*/ }3636+};3737+3838+static void __init of_at91sam9x5_sckc_setup(struct device_node *np)3939+{4040+ struct device_node *childnp;4141+ void (*clk_setup)(struct device_node *, void __iomem *);4242+ const struct of_device_id *clk_id;4343+ void __iomem *regbase = of_iomap(np, 0);4444+4545+ if (!regbase)4646+ return;4747+4848+ for_each_child_of_node(np, childnp) {4949+ clk_id = of_match_node(sckc_clk_ids, childnp);5050+ if (!clk_id)5151+ continue;5252+ clk_setup = clk_id->data;5353+ clk_setup(childnp, regbase);5454+ }5555+}5656+CLK_OF_DECLARE(at91sam9x5_clk_sckc, "atmel,at91sam9x5-sckc",5757+ of_at91sam9x5_sckc_setup);
+22
drivers/clk/at91/sckc.h
···11+/*22+ * drivers/clk/at91/sckc.h33+ *44+ * Copyright (C) 2013 Boris BREZILLON <b.brezillon@overkiz.com>55+ *66+ * This program is free software; you can redistribute it and/or modify77+ * it under the terms of the GNU General Public License as published by88+ * the Free Software Foundation; either version 2 of the License, or99+ * (at your option) any later version.1010+ */1111+1212+#ifndef __AT91_SCKC_H_1313+#define __AT91_SCKC_H_1414+1515+extern void __init of_at91sam9x5_clk_slow_osc_setup(struct device_node *np,1616+ void __iomem *sckcr);1717+extern void __init of_at91sam9x5_clk_slow_rc_osc_setup(struct device_node *np,1818+ void __iomem *sckcr);1919+extern void __init of_at91sam9x5_clk_slow_setup(struct device_node *np,2020+ void __iomem *sckcr);2121+2222+#endif /* __AT91_SCKC_H_ */
+295-51
drivers/iio/adc/at91_adc.c
···3131#include <linux/iio/trigger_consumer.h>3232#include <linux/iio/triggered_buffer.h>33333434-#include <mach/at91_adc.h>3434+/* Registers */3535+#define AT91_ADC_CR 0x00 /* Control Register */3636+#define AT91_ADC_SWRST (1 << 0) /* Software Reset */3737+#define AT91_ADC_START (1 << 1) /* Start Conversion */3838+3939+#define AT91_ADC_MR 0x04 /* Mode Register */4040+#define AT91_ADC_TSAMOD (3 << 0) /* ADC mode */4141+#define AT91_ADC_TSAMOD_ADC_ONLY_MODE (0 << 0) /* ADC Mode */4242+#define AT91_ADC_TSAMOD_TS_ONLY_MODE (1 << 0) /* Touch Screen Only Mode */4343+#define AT91_ADC_TRGEN (1 << 0) /* Trigger Enable */4444+#define AT91_ADC_TRGSEL (7 << 1) /* Trigger Selection */4545+#define AT91_ADC_TRGSEL_TC0 (0 << 1)4646+#define AT91_ADC_TRGSEL_TC1 (1 << 1)4747+#define AT91_ADC_TRGSEL_TC2 (2 << 1)4848+#define AT91_ADC_TRGSEL_EXTERNAL (6 << 1)4949+#define AT91_ADC_LOWRES (1 << 4) /* Low Resolution */5050+#define AT91_ADC_SLEEP (1 << 5) /* Sleep Mode */5151+#define AT91_ADC_PENDET (1 << 6) /* Pen contact detection enable */5252+#define AT91_ADC_PRESCAL_9260 (0x3f << 8) /* Prescalar Rate Selection */5353+#define AT91_ADC_PRESCAL_9G45 (0xff << 8)5454+#define AT91_ADC_PRESCAL_(x) ((x) << 8)5555+#define AT91_ADC_STARTUP_9260 (0x1f << 16) /* Startup Up Time */5656+#define AT91_ADC_STARTUP_9G45 (0x7f << 16)5757+#define AT91_ADC_STARTUP_9X5 (0xf << 16)5858+#define AT91_ADC_STARTUP_(x) ((x) << 16)5959+#define AT91_ADC_SHTIM (0xf << 24) /* Sample & Hold Time */6060+#define AT91_ADC_SHTIM_(x) ((x) << 24)6161+#define AT91_ADC_PENDBC (0x0f << 28) /* Pen Debounce time */6262+#define AT91_ADC_PENDBC_(x) ((x) << 28)6363+6464+#define AT91_ADC_TSR 0x0C6565+#define AT91_ADC_TSR_SHTIM (0xf << 24) /* Sample & Hold Time */6666+#define AT91_ADC_TSR_SHTIM_(x) ((x) << 24)6767+6868+#define AT91_ADC_CHER 0x10 /* Channel Enable Register */6969+#define AT91_ADC_CHDR 0x14 /* Channel Disable Register */7070+#define AT91_ADC_CHSR 0x18 /* Channel Status Register */7171+#define AT91_ADC_CH(n) (1 << (n)) /* Channel Number */7272+7373+#define AT91_ADC_SR 0x1C /* Status Register */7474+#define AT91_ADC_EOC(n) (1 << (n)) /* End of Conversion on Channel N */7575+#define AT91_ADC_OVRE(n) (1 << ((n) + 8))/* Overrun Error on Channel N */7676+#define AT91_ADC_DRDY (1 << 16) /* Data Ready */7777+#define AT91_ADC_GOVRE (1 << 17) /* General Overrun Error */7878+#define AT91_ADC_ENDRX (1 << 18) /* End of RX Buffer */7979+#define AT91_ADC_RXFUFF (1 << 19) /* RX Buffer Full */8080+8181+#define AT91_ADC_SR_9X5 0x30 /* Status Register for 9x5 */8282+#define AT91_ADC_SR_DRDY_9X5 (1 << 24) /* Data Ready */8383+8484+#define AT91_ADC_LCDR 0x20 /* Last Converted Data Register */8585+#define AT91_ADC_LDATA (0x3ff)8686+8787+#define AT91_ADC_IER 0x24 /* Interrupt Enable Register */8888+#define AT91_ADC_IDR 0x28 /* Interrupt Disable Register */8989+#define AT91_ADC_IMR 0x2C /* Interrupt Mask Register */9090+#define AT91RL_ADC_IER_PEN (1 << 20)9191+#define AT91RL_ADC_IER_NOPEN (1 << 21)9292+#define AT91_ADC_IER_PEN (1 << 29)9393+#define AT91_ADC_IER_NOPEN (1 << 30)9494+#define AT91_ADC_IER_XRDY (1 << 20)9595+#define AT91_ADC_IER_YRDY (1 << 21)9696+#define AT91_ADC_IER_PRDY (1 << 22)9797+#define AT91_ADC_ISR_PENS (1 << 31)9898+9999+#define AT91_ADC_CHR(n) (0x30 + ((n) * 4)) /* Channel Data Register N */100100+#define AT91_ADC_DATA (0x3ff)101101+102102+#define AT91_ADC_CDR0_9X5 (0x50) /* Channel Data Register 0 for 9X5 */103103+104104+#define AT91_ADC_ACR 0x94 /* Analog Control Register */105105+#define AT91_ADC_ACR_PENDETSENS (0x3 << 0) /* pull-up resistor */106106+107107+#define AT91_ADC_TSMR 0xB0108108+#define AT91_ADC_TSMR_TSMODE (3 << 0) /* Touch Screen Mode */109109+#define AT91_ADC_TSMR_TSMODE_NONE (0 << 0)110110+#define AT91_ADC_TSMR_TSMODE_4WIRE_NO_PRESS (1 << 0)111111+#define AT91_ADC_TSMR_TSMODE_4WIRE_PRESS (2 << 0)112112+#define AT91_ADC_TSMR_TSMODE_5WIRE (3 << 0)113113+#define AT91_ADC_TSMR_TSAV (3 << 4) /* Averages samples */114114+#define AT91_ADC_TSMR_TSAV_(x) ((x) << 4)115115+#define AT91_ADC_TSMR_SCTIM (0x0f << 16) /* Switch closure time */116116+#define AT91_ADC_TSMR_PENDBC (0x0f << 28) /* Pen Debounce time */117117+#define AT91_ADC_TSMR_PENDBC_(x) ((x) << 28)118118+#define AT91_ADC_TSMR_NOTSDMA (1 << 22) /* No Touchscreen DMA */119119+#define AT91_ADC_TSMR_PENDET_DIS (0 << 24) /* Pen contact detection disable */120120+#define AT91_ADC_TSMR_PENDET_ENA (1 << 24) /* Pen contact detection enable */121121+122122+#define AT91_ADC_TSXPOSR 0xB4123123+#define AT91_ADC_TSYPOSR 0xB8124124+#define AT91_ADC_TSPRESSR 0xBC125125+126126+#define AT91_ADC_TRGR_9260 AT91_ADC_MR127127+#define AT91_ADC_TRGR_9G45 0x08128128+#define AT91_ADC_TRGR_9X5 0xC0129129+130130+/* Trigger Register bit field */131131+#define AT91_ADC_TRGR_TRGPER (0xffff << 16)132132+#define AT91_ADC_TRGR_TRGPER_(x) ((x) << 16)133133+#define AT91_ADC_TRGR_TRGMOD (0x7 << 0)134134+#define AT91_ADC_TRGR_NONE (0 << 0)135135+#define AT91_ADC_TRGR_MOD_PERIOD_TRIG (5 << 0)3513636137#define AT91_ADC_CHAN(st, ch) \37138 (st->registers->channel_base + (ch * 4))···1464514746#define TOUCH_SAMPLE_PERIOD_US 2000 /* 2ms */14847#define TOUCH_PEN_DETECT_DEBOUNCE_US 2004848+4949+#define MAX_RLPOS_BITS 105050+#define TOUCH_SAMPLE_PERIOD_US_RL 10000 /* 10ms, the SoC can't keep up with 2ms */5151+#define TOUCH_SHTIM 0xa5252+5353+/**5454+ * struct at91_adc_reg_desc - Various informations relative to registers5555+ * @channel_base: Base offset for the channel data registers5656+ * @drdy_mask: Mask of the DRDY field in the relevant registers5757+ (Interruptions registers mostly)5858+ * @status_register: Offset of the Interrupt Status Register5959+ * @trigger_register: Offset of the Trigger setup register6060+ * @mr_prescal_mask: Mask of the PRESCAL field in the adc MR register6161+ * @mr_startup_mask: Mask of the STARTUP field in the adc MR register6262+ */6363+struct at91_adc_reg_desc {6464+ u8 channel_base;6565+ u32 drdy_mask;6666+ u8 status_register;6767+ u8 trigger_register;6868+ u32 mr_prescal_mask;6969+ u32 mr_startup_mask;7070+};1497115072struct at91_adc_caps {15173 bool has_ts; /* Support touch screen */···1866218763 u8 num_channels;18864 struct at91_adc_reg_desc registers;189189-};190190-191191-enum atmel_adc_ts_type {192192- ATMEL_ADC_TOUCHSCREEN_NONE = 0,193193- ATMEL_ADC_TOUCHSCREEN_4WIRE = 4,194194- ATMEL_ADC_TOUCHSCREEN_5WIRE = 5,19565};1966619767struct at91_adc_state {···232114233115 u16 ts_sample_period_val;234116 u32 ts_pressure_threshold;117117+ u16 ts_pendbc;118118+119119+ bool ts_bufferedmeasure;120120+ u32 ts_prev_absx;121121+ u32 ts_prev_absy;235122};236123237124static irqreturn_t at91_adc_trigger_handler(int irq, void *p)···343220 return 0;344221}345222346346-static irqreturn_t at91_adc_interrupt(int irq, void *private)223223+static irqreturn_t at91_adc_rl_interrupt(int irq, void *private)224224+{225225+ struct iio_dev *idev = private;226226+ struct at91_adc_state *st = iio_priv(idev);227227+ u32 status = at91_adc_readl(st, st->registers->status_register);228228+ unsigned int reg;229229+230230+ status &= at91_adc_readl(st, AT91_ADC_IMR);231231+ if (status & st->registers->drdy_mask)232232+ handle_adc_eoc_trigger(irq, idev);233233+234234+ if (status & AT91RL_ADC_IER_PEN) {235235+ /* Disabling pen debounce is required to get a NOPEN irq */236236+ reg = at91_adc_readl(st, AT91_ADC_MR);237237+ reg &= ~AT91_ADC_PENDBC;238238+ at91_adc_writel(st, AT91_ADC_MR, reg);239239+240240+ at91_adc_writel(st, AT91_ADC_IDR, AT91RL_ADC_IER_PEN);241241+ at91_adc_writel(st, AT91_ADC_IER, AT91RL_ADC_IER_NOPEN242242+ | AT91_ADC_EOC(3));243243+ /* Set up period trigger for sampling */244244+ at91_adc_writel(st, st->registers->trigger_register,245245+ AT91_ADC_TRGR_MOD_PERIOD_TRIG |246246+ AT91_ADC_TRGR_TRGPER_(st->ts_sample_period_val));247247+ } else if (status & AT91RL_ADC_IER_NOPEN) {248248+ reg = at91_adc_readl(st, AT91_ADC_MR);249249+ reg |= AT91_ADC_PENDBC_(st->ts_pendbc) & AT91_ADC_PENDBC;250250+ at91_adc_writel(st, AT91_ADC_MR, reg);251251+ at91_adc_writel(st, st->registers->trigger_register,252252+ AT91_ADC_TRGR_NONE);253253+254254+ at91_adc_writel(st, AT91_ADC_IDR, AT91RL_ADC_IER_NOPEN255255+ | AT91_ADC_EOC(3));256256+ at91_adc_writel(st, AT91_ADC_IER, AT91RL_ADC_IER_PEN);257257+ st->ts_bufferedmeasure = false;258258+ input_report_key(st->ts_input, BTN_TOUCH, 0);259259+ input_sync(st->ts_input);260260+ } else if (status & AT91_ADC_EOC(3)) {261261+ /* Conversion finished */262262+ if (st->ts_bufferedmeasure) {263263+ /*264264+ * Last measurement is always discarded, since it can265265+ * be erroneous.266266+ * Always report previous measurement267267+ */268268+ input_report_abs(st->ts_input, ABS_X, st->ts_prev_absx);269269+ input_report_abs(st->ts_input, ABS_Y, st->ts_prev_absy);270270+ input_report_key(st->ts_input, BTN_TOUCH, 1);271271+ input_sync(st->ts_input);272272+ } else273273+ st->ts_bufferedmeasure = true;274274+275275+ /* Now make new measurement */276276+ st->ts_prev_absx = at91_adc_readl(st, AT91_ADC_CHAN(st, 3))277277+ << MAX_RLPOS_BITS;278278+ st->ts_prev_absx /= at91_adc_readl(st, AT91_ADC_CHAN(st, 2));279279+280280+ st->ts_prev_absy = at91_adc_readl(st, AT91_ADC_CHAN(st, 1))281281+ << MAX_RLPOS_BITS;282282+ st->ts_prev_absy /= at91_adc_readl(st, AT91_ADC_CHAN(st, 0));283283+ }284284+285285+ return IRQ_HANDLED;286286+}287287+288288+static irqreturn_t at91_adc_9x5_interrupt(int irq, void *private)347289{348290 struct iio_dev *idev = private;349291 struct at91_adc_state *st = iio_priv(idev);···841653 return -EINVAL;842654 }843655656656+ if (!st->caps->has_tsmr)657657+ return 0;844658 prop = 0;845659 of_property_read_u32(node, "atmel,adc-ts-pressure-threshold", &prop);846660 st->ts_pressure_threshold = prop;···966776 st->trigger_number = pdata->trigger_number;967777 st->trigger_list = pdata->trigger_list;968778 st->registers = &st->caps->registers;779779+ st->touchscreen_type = pdata->touchscreen_type;969780970781 return 0;971782}···981790{982791 struct at91_adc_state *st = input_get_drvdata(dev);983792984984- at91_adc_writel(st, AT91_ADC_IER, AT91_ADC_IER_PEN);793793+ if (st->caps->has_tsmr)794794+ at91_adc_writel(st, AT91_ADC_IER, AT91_ADC_IER_PEN);795795+ else796796+ at91_adc_writel(st, AT91_ADC_IER, AT91RL_ADC_IER_PEN);985797 return 0;986798}987799···992798{993799 struct at91_adc_state *st = input_get_drvdata(dev);994800995995- at91_adc_writel(st, AT91_ADC_IDR, AT91_ADC_IER_PEN);801801+ if (st->caps->has_tsmr)802802+ at91_adc_writel(st, AT91_ADC_IDR, AT91_ADC_IER_PEN);803803+ else804804+ at91_adc_writel(st, AT91_ADC_IDR, AT91RL_ADC_IER_PEN);996805}997806998807static int at91_ts_hw_init(struct at91_adc_state *st, u32 adc_clk_khz)999808{10001000- u32 reg = 0, pendbc;809809+ u32 reg = 0;1001810 int i = 0;811811+812812+ /* a Pen Detect Debounce Time is necessary for the ADC Touch to avoid813813+ * pen detect noise.814814+ * The formula is : Pen Detect Debounce Time = (2 ^ pendbc) / ADCClock815815+ */816816+ st->ts_pendbc = round_up(TOUCH_PEN_DETECT_DEBOUNCE_US * adc_clk_khz /817817+ 1000, 1);818818+819819+ while (st->ts_pendbc >> ++i)820820+ ; /* Empty! Find the shift offset */821821+ if (abs(st->ts_pendbc - (1 << i)) < abs(st->ts_pendbc - (1 << (i - 1))))822822+ st->ts_pendbc = i;823823+ else824824+ st->ts_pendbc = i - 1;825825+826826+ if (!st->caps->has_tsmr) {827827+ reg = at91_adc_readl(st, AT91_ADC_MR);828828+ reg |= AT91_ADC_TSAMOD_TS_ONLY_MODE | AT91_ADC_PENDET;829829+830830+ reg |= AT91_ADC_PENDBC_(st->ts_pendbc) & AT91_ADC_PENDBC;831831+ at91_adc_writel(st, AT91_ADC_MR, reg);832832+833833+ reg = AT91_ADC_TSR_SHTIM_(TOUCH_SHTIM) & AT91_ADC_TSR_SHTIM;834834+ at91_adc_writel(st, AT91_ADC_TSR, reg);835835+836836+ st->ts_sample_period_val = round_up((TOUCH_SAMPLE_PERIOD_US_RL *837837+ adc_clk_khz / 1000) - 1, 1);838838+839839+ return 0;840840+ }10028411003842 if (st->touchscreen_type == ATMEL_ADC_TOUCHSCREEN_4WIRE)1004843 reg = AT91_ADC_TSMR_TSMODE_4WIRE_PRESS;1005844 else1006845 reg = AT91_ADC_TSMR_TSMODE_5WIRE;100784610081008- /* a Pen Detect Debounce Time is necessary for the ADC Touch to avoid10091009- * pen detect noise.10101010- * The formula is : Pen Detect Debounce Time = (2 ^ pendbc) / ADCClock10111011- */10121012- pendbc = round_up(TOUCH_PEN_DETECT_DEBOUNCE_US * adc_clk_khz / 1000, 1);847847+ reg |= AT91_ADC_TSMR_TSAV_(st->caps->ts_filter_average)848848+ & AT91_ADC_TSMR_TSAV;849849+ reg |= AT91_ADC_TSMR_PENDBC_(st->ts_pendbc) & AT91_ADC_TSMR_PENDBC;850850+ reg |= AT91_ADC_TSMR_NOTSDMA;851851+ reg |= AT91_ADC_TSMR_PENDET_ENA;852852+ reg |= 0x03 << 8; /* TSFREQ, needs to be bigger than TSAV */101385310141014- while (pendbc >> ++i)10151015- ; /* Empty! Find the shift offset */10161016- if (abs(pendbc - (1 << i)) < abs(pendbc - (1 << (i - 1))))10171017- pendbc = i;10181018- else10191019- pendbc = i - 1;10201020-10211021- if (st->caps->has_tsmr) {10221022- reg |= AT91_ADC_TSMR_TSAV_(st->caps->ts_filter_average)10231023- & AT91_ADC_TSMR_TSAV;10241024- reg |= AT91_ADC_TSMR_PENDBC_(pendbc) & AT91_ADC_TSMR_PENDBC;10251025- reg |= AT91_ADC_TSMR_NOTSDMA;10261026- reg |= AT91_ADC_TSMR_PENDET_ENA;10271027- reg |= 0x03 << 8; /* TSFREQ, need bigger than TSAV */10281028-10291029- at91_adc_writel(st, AT91_ADC_TSMR, reg);10301030- } else {10311031- /* TODO: for 9g45 which has no TSMR */10321032- }854854+ at91_adc_writel(st, AT91_ADC_TSMR, reg);10338551034856 /* Change adc internal resistor value for better pen detection,1035857 * default value is 100 kOhm.···1055845 at91_adc_writel(st, AT91_ADC_ACR, st->caps->ts_pen_detect_sensitivity1056846 & AT91_ADC_ACR_PENDETSENS);105784710581058- /* Sample Peroid Time = (TRGPER + 1) / ADCClock */848848+ /* Sample Period Time = (TRGPER + 1) / ADCClock */1059849 st->ts_sample_period_val = round_up((TOUCH_SAMPLE_PERIOD_US *1060850 adc_clk_khz / 1000) - 1, 1);1061851···1084874 __set_bit(EV_ABS, input->evbit);1085875 __set_bit(EV_KEY, input->evbit);1086876 __set_bit(BTN_TOUCH, input->keybit);10871087- input_set_abs_params(input, ABS_X, 0, (1 << MAX_POS_BITS) - 1, 0, 0);10881088- input_set_abs_params(input, ABS_Y, 0, (1 << MAX_POS_BITS) - 1, 0, 0);10891089- input_set_abs_params(input, ABS_PRESSURE, 0, 0xffffff, 0, 0);877877+ if (st->caps->has_tsmr) {878878+ input_set_abs_params(input, ABS_X, 0, (1 << MAX_POS_BITS) - 1,879879+ 0, 0);880880+ input_set_abs_params(input, ABS_Y, 0, (1 << MAX_POS_BITS) - 1,881881+ 0, 0);882882+ input_set_abs_params(input, ABS_PRESSURE, 0, 0xffffff, 0, 0);883883+ } else {884884+ if (st->touchscreen_type != ATMEL_ADC_TOUCHSCREEN_4WIRE) {885885+ dev_err(&pdev->dev,886886+ "This touchscreen controller only support 4 wires\n");887887+ ret = -EINVAL;888888+ goto err;889889+ }890890+891891+ input_set_abs_params(input, ABS_X, 0, (1 << MAX_RLPOS_BITS) - 1,892892+ 0, 0);893893+ input_set_abs_params(input, ABS_Y, 0, (1 << MAX_RLPOS_BITS) - 1,894894+ 0, 0);895895+ }10908961091897 st->ts_input = input;1092898 input_set_drvdata(input, st);10938991094900 ret = input_register_device(input);1095901 if (ret)10961096- input_free_device(st->ts_input);902902+ goto err;1097903904904+ return ret;905905+906906+err:907907+ input_free_device(st->ts_input);1098908 return ret;1099909}1100910···1173943 */1174944 at91_adc_writel(st, AT91_ADC_CR, AT91_ADC_SWRST);1175945 at91_adc_writel(st, AT91_ADC_IDR, 0xFFFFFFFF);11761176- ret = request_irq(st->irq,11771177- at91_adc_interrupt,11781178- 0,11791179- pdev->dev.driver->name,11801180- idev);946946+947947+ if (st->caps->has_tsmr)948948+ ret = request_irq(st->irq, at91_adc_9x5_interrupt, 0,949949+ pdev->dev.driver->name, idev);950950+ else951951+ ret = request_irq(st->irq, at91_adc_rl_interrupt, 0,952952+ pdev->dev.driver->name, idev);1181953 if (ret) {1182954 dev_err(&pdev->dev, "Failed to allocate IRQ.\n");1183955 return ret;···12831051 goto error_disable_adc_clk;12841052 }12851053 } else {12861286- if (!st->caps->has_tsmr) {12871287- dev_err(&pdev->dev, "We don't support non-TSMR adc\n");12881288- ret = -ENODEV;12891289- goto error_disable_adc_clk;12901290- }12911291-12921054 ret = at91_ts_register(st, pdev);12931055 if (ret)12941056 goto error_disable_adc_clk;···13461120 },13471121};1348112211231123+static struct at91_adc_caps at91sam9rl_caps = {11241124+ .has_ts = true,11251125+ .calc_startup_ticks = calc_startup_ticks_9260, /* same as 9260 */11261126+ .num_channels = 6,11271127+ .registers = {11281128+ .channel_base = AT91_ADC_CHR(0),11291129+ .drdy_mask = AT91_ADC_DRDY,11301130+ .status_register = AT91_ADC_SR,11311131+ .trigger_register = AT91_ADC_TRGR_9G45,11321132+ .mr_prescal_mask = AT91_ADC_PRESCAL_9260,11331133+ .mr_startup_mask = AT91_ADC_STARTUP_9G45,11341134+ },11351135+};11361136+13491137static struct at91_adc_caps at91sam9g45_caps = {13501138 .has_ts = true,13511139 .calc_startup_ticks = calc_startup_ticks_9260, /* same as 9260 */···1394115413951155static const struct of_device_id at91_adc_dt_ids[] = {13961156 { .compatible = "atmel,at91sam9260-adc", .data = &at91sam9260_caps },11571157+ { .compatible = "atmel,at91sam9rl-adc", .data = &at91sam9rl_caps },13971158 { .compatible = "atmel,at91sam9g45-adc", .data = &at91sam9g45_caps },13981159 { .compatible = "atmel,at91sam9x5-adc", .data = &at91sam9x5_caps },13991160 {},···14051164 {14061165 .name = "at91sam9260-adc",14071166 .driver_data = (unsigned long)&at91sam9260_caps,11671167+ }, {11681168+ .name = "at91sam9rl-adc",11691169+ .driver_data = (unsigned long)&at91sam9rl_caps,14081170 }, {14091171 .name = "at91sam9g45-adc",14101172 .driver_data = (unsigned long)&at91sam9g45_caps,
-12
drivers/input/touchscreen/Kconfig
···550550 To compile this driver as a module, choose M here: the551551 module will be called ti_am335x_tsc.552552553553-config TOUCHSCREEN_ATMEL_TSADCC554554- tristate "Atmel Touchscreen Interface"555555- depends on ARCH_AT91556556- help557557- Say Y here if you have a 4-wire touchscreen connected to the558558- ADC Controller on your Atmel SoC.559559-560560- If unsure, say N.561561-562562- To compile this driver as a module, choose M here: the563563- module will be called atmel_tsadcc.564564-565553config TOUCHSCREEN_UCB1400566554 tristate "Philips UCB1400 touchscreen"567555 depends on AC97_BUS
···77#ifndef _AT91_ADC_H_88#define _AT91_ADC_H_991010-/**1111- * struct at91_adc_reg_desc - Various informations relative to registers1212- * @channel_base: Base offset for the channel data registers1313- * @drdy_mask: Mask of the DRDY field in the relevant registers1414- (Interruptions registers mostly)1515- * @status_register: Offset of the Interrupt Status Register1616- * @trigger_register: Offset of the Trigger setup register1717- * @mr_prescal_mask: Mask of the PRESCAL field in the adc MR register1818- * @mr_startup_mask: Mask of the STARTUP field in the adc MR register1919- */2020-struct at91_adc_reg_desc {2121- u8 channel_base;2222- u32 drdy_mask;2323- u8 status_register;2424- u8 trigger_register;2525- u32 mr_prescal_mask;2626- u32 mr_startup_mask;1010+enum atmel_adc_ts_type {1111+ ATMEL_ADC_TOUCHSCREEN_NONE = 0,1212+ ATMEL_ADC_TOUCHSCREEN_4WIRE = 4,1313+ ATMEL_ADC_TOUCHSCREEN_5WIRE = 5,2714};28152916/**···2942/**3043 * struct at91_adc_data - platform data for ADC driver3144 * @channels_used: channels in use on the board as a bitmask3232- * @num_channels: global number of channels available on the board3333- * @registers: Registers definition on the board3445 * @startup_time: startup time of the ADC in microseconds3546 * @trigger_list: Triggers available in the ADC3647 * @trigger_number: Number of triggers available in the ADC3748 * @use_external_triggers: does the board has external triggers availables3849 * @vref: Reference voltage for the ADC in millivolts5050+ * @touchscreen_type: If a touchscreen is connected, its type (4 or 5 wires)3951 */4052struct at91_adc_data {4153 unsigned long channels_used;4242- u8 num_channels;4343- struct at91_adc_reg_desc *registers;4454 u8 startup_time;4555 struct at91_adc_trigger *trigger_list;4656 u8 trigger_number;4757 bool use_external_triggers;4858 u16 vref;5959+ enum atmel_adc_ts_type touchscreen_type;4960};50615162extern void __init at91_add_device_adc(struct at91_adc_data *data);
-7
include/linux/platform_data/atmel.h
···8787 int rts_gpio; /* optional RTS GPIO */8888};89899090- /* Touchscreen Controller */9191-struct at91_tsadcc_data {9292- unsigned int adc_clock;9393- u8 pendet_debounce;9494- u8 ts_sample_hold_time;9595-};9696-9790/* CAN */9891struct at91_can_data {9992 void (*transceiver_switch)(int on);