Commit 4c459117 authored by Ziping Chen's avatar Ziping Chen Committed by Dmitry Torokhov

Input: sun4i-a10-lradc-keys - add support for A83T

Allwinner A83T SoC has a low res adc like the one in Allwinner A10 SoC,
however, the A10 SoC's vref of lradc internally is divided by 2/3 and
the A83T SoC's vref of lradc internally is divided by 3/4, thus add
a hardware variant for it to be compatible with various devices.
Signed-off-by: default avatarZiping Chen <techping.chan@gmail.com>
Acked-by: default avatarMaxime Ripard <maxime.ripard@free-electrons.com>
Acked-by: default avatarRob Herring <robh@kernel.org>
Signed-off-by: default avatarDmitry Torokhov <dmitry.torokhov@gmail.com>
parent fb3c09ba
...@@ -2,12 +2,14 @@ Allwinner sun4i low res adc attached tablet keys ...@@ -2,12 +2,14 @@ Allwinner sun4i low res adc attached tablet keys
------------------------------------------------ ------------------------------------------------
Required properties: Required properties:
- compatible: "allwinner,sun4i-a10-lradc-keys" - compatible: should be one of the following string:
"allwinner,sun4i-a10-lradc-keys"
"allwinner,sun8i-a83t-r-lradc"
- reg: mmio address range of the chip - reg: mmio address range of the chip
- interrupts: interrupt to which the chip is connected - interrupts: interrupt to which the chip is connected
- vref-supply: powersupply for the lradc reference voltage - vref-supply: powersupply for the lradc reference voltage
Each key is represented as a sub-node of "allwinner,sun4i-a10-lradc-keys": Each key is represented as a sub-node of the compatible mentioned above:
Required subnode-properties: Required subnode-properties:
- label: Descriptive name of the key. - label: Descriptive name of the key.
......
...@@ -46,6 +46,7 @@ ...@@ -46,6 +46,7 @@
#define CONTINUE_TIME_SEL(x) ((x) << 16) /* 4 bits */ #define CONTINUE_TIME_SEL(x) ((x) << 16) /* 4 bits */
#define KEY_MODE_SEL(x) ((x) << 12) /* 2 bits */ #define KEY_MODE_SEL(x) ((x) << 12) /* 2 bits */
#define LEVELA_B_CNT(x) ((x) << 8) /* 4 bits */ #define LEVELA_B_CNT(x) ((x) << 8) /* 4 bits */
#define HOLD_KEY_EN(x) ((x) << 7)
#define HOLD_EN(x) ((x) << 6) #define HOLD_EN(x) ((x) << 6)
#define LEVELB_VOL(x) ((x) << 4) /* 2 bits */ #define LEVELB_VOL(x) ((x) << 4) /* 2 bits */
#define SAMPLE_RATE(x) ((x) << 2) /* 2 bits */ #define SAMPLE_RATE(x) ((x) << 2) /* 2 bits */
...@@ -63,6 +64,25 @@ ...@@ -63,6 +64,25 @@
#define CHAN0_KEYDOWN_IRQ BIT(1) #define CHAN0_KEYDOWN_IRQ BIT(1)
#define CHAN0_DATA_IRQ BIT(0) #define CHAN0_DATA_IRQ BIT(0)
/* struct lradc_variant - Describe sun4i-a10-lradc-keys hardware variant
* @divisor_numerator: The numerator of lradc Vref internally divisor
* @divisor_denominator: The denominator of lradc Vref internally divisor
*/
struct lradc_variant {
u8 divisor_numerator;
u8 divisor_denominator;
};
static const struct lradc_variant lradc_variant_a10 = {
.divisor_numerator = 2,
.divisor_denominator = 3
};
static const struct lradc_variant r_lradc_variant_a83t = {
.divisor_numerator = 3,
.divisor_denominator = 4
};
struct sun4i_lradc_keymap { struct sun4i_lradc_keymap {
u32 voltage; u32 voltage;
u32 keycode; u32 keycode;
...@@ -74,6 +94,7 @@ struct sun4i_lradc_data { ...@@ -74,6 +94,7 @@ struct sun4i_lradc_data {
void __iomem *base; void __iomem *base;
struct regulator *vref_supply; struct regulator *vref_supply;
struct sun4i_lradc_keymap *chan0_map; struct sun4i_lradc_keymap *chan0_map;
const struct lradc_variant *variant;
u32 chan0_map_count; u32 chan0_map_count;
u32 chan0_keycode; u32 chan0_keycode;
u32 vref; u32 vref;
...@@ -128,9 +149,9 @@ static int sun4i_lradc_open(struct input_dev *dev) ...@@ -128,9 +149,9 @@ static int sun4i_lradc_open(struct input_dev *dev)
if (error) if (error)
return error; return error;
/* lradc Vref internally is divided by 2/3 */ lradc->vref = regulator_get_voltage(lradc->vref_supply) *
lradc->vref = regulator_get_voltage(lradc->vref_supply) * 2 / 3; lradc->variant->divisor_numerator /
lradc->variant->divisor_denominator;
/* /*
* Set sample time to 4 ms / 250 Hz. Wait 2 * 4 ms for key to * Set sample time to 4 ms / 250 Hz. Wait 2 * 4 ms for key to
* stabilize on press, wait (1 + 1) * 4 ms for key release * stabilize on press, wait (1 + 1) * 4 ms for key release
...@@ -222,6 +243,12 @@ static int sun4i_lradc_probe(struct platform_device *pdev) ...@@ -222,6 +243,12 @@ static int sun4i_lradc_probe(struct platform_device *pdev)
if (error) if (error)
return error; return error;
lradc->variant = of_device_get_match_data(&pdev->dev);
if (!lradc->variant) {
dev_err(&pdev->dev, "Missing sun4i-a10-lradc-keys variant\n");
return -EINVAL;
}
lradc->vref_supply = devm_regulator_get(dev, "vref"); lradc->vref_supply = devm_regulator_get(dev, "vref");
if (IS_ERR(lradc->vref_supply)) if (IS_ERR(lradc->vref_supply))
return PTR_ERR(lradc->vref_supply); return PTR_ERR(lradc->vref_supply);
...@@ -265,7 +292,10 @@ static int sun4i_lradc_probe(struct platform_device *pdev) ...@@ -265,7 +292,10 @@ static int sun4i_lradc_probe(struct platform_device *pdev)
} }
static const struct of_device_id sun4i_lradc_of_match[] = { static const struct of_device_id sun4i_lradc_of_match[] = {
{ .compatible = "allwinner,sun4i-a10-lradc-keys", }, { .compatible = "allwinner,sun4i-a10-lradc-keys",
.data = &lradc_variant_a10 },
{ .compatible = "allwinner,sun8i-a83t-r-lradc",
.data = &r_lradc_variant_a83t },
{ /* sentinel */ } { /* sentinel */ }
}; };
MODULE_DEVICE_TABLE(of, sun4i_lradc_of_match); MODULE_DEVICE_TABLE(of, sun4i_lradc_of_match);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment