2017-06-20 21:44 GMT+08:00 Ziping Chen <[email protected]>:

> From: Ziping Chen <[email protected]>
>
> 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 isn't, thus add a hardware variant for it to
> be compatible with various devices.
>
> Signed-off-by: Ziping Chen <[email protected]>
> ---
>  drivers/input/keyboard/sun4i-lradc-keys.c | 39
> +++++++++++++++++++++++++++----
>  1 file changed, 35 insertions(+), 4 deletions(-)
>
> diff --git a/drivers/input/keyboard/sun4i-lradc-keys.c
> b/drivers/input/keyboard/sun4i-lradc-keys.c
> index a37c172452e6..3cd981138efc 100644
> --- a/drivers/input/keyboard/sun4i-lradc-keys.c
> +++ b/drivers/input/keyboard/sun4i-lradc-keys.c
> @@ -46,6 +46,7 @@
>  #define CONTINUE_TIME_SEL(x)   ((x) << 16) /* 4 bits */
>  #define KEY_MODE_SEL(x)                ((x) << 12) /* 2 bits */
>  #define LEVELA_B_CNT(x)                ((x) << 8)  /* 4 bits */
> +#define HOLD_KEY_EN(x)         ((x) << 7)
>  #define HOLD_EN(x)             ((x) << 6)
>  #define LEVELB_VOL(x)          ((x) << 4)  /* 2 bits */
>  #define SAMPLE_RATE(x)         ((x) << 2)  /* 2 bits */
> @@ -63,6 +64,25 @@
>  #define        CHAN0_KEYDOWN_IRQ       BIT(1)
>  #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 = 1,
> +       .divisor_denominator = 1
> +};
> +
>  struct sun4i_lradc_keymap {
>         u32 voltage;
>         u32 keycode;
> @@ -74,6 +94,7 @@ struct sun4i_lradc_data {
>         void __iomem *base;
>         struct regulator *vref_supply;
>         struct sun4i_lradc_keymap *chan0_map;
> +       const struct lradc_variant *variant;
>         u32 chan0_map_count;
>         u32 chan0_keycode;
>         u32 vref;
> @@ -99,6 +120,7 @@ static irqreturn_t sun4i_lradc_irq(int irq, void
> *dev_id)
>         if ((ints & CHAN0_KEYDOWN_IRQ) && lradc->chan0_keycode == 0) {
>                 val = readl(lradc->base + LRADC_DATA0) & 0x3f;
>                 voltage = val * lradc->vref / 63;
> +               printk("voltage %d\n", voltage);
>

Oh.....sorry, this is excess....

>
>                 for (i = 0; i < lradc->chan0_map_count; i++) {
>                         diff = abs(lradc->chan0_map[i].voltage - voltage);
> @@ -128,9 +150,9 @@ static int sun4i_lradc_open(struct input_dev *dev)
>         if (error)
>                 return error;
>
> -       /* lradc Vref internally is divided by 2/3 */
> -       lradc->vref = regulator_get_voltage(lradc->vref_supply) * 2 / 3;
> -
> +       lradc->vref = regulator_get_voltage(lradc->vref_supply) *
> +                     lradc->variant->divisor_numerator /
> +                     lradc->variant->divisor_denominator;
>         /*
>          * 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
> @@ -222,6 +244,12 @@ static int sun4i_lradc_probe(struct platform_device
> *pdev)
>         if (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");
>         if (IS_ERR(lradc->vref_supply))
>                 return PTR_ERR(lradc->vref_supply);
> @@ -265,7 +293,10 @@ static int sun4i_lradc_probe(struct platform_device
> *pdev)
>  }
>
>  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-keys",
> +               .data = &r_lradc_variant_a83t },
>         { /* sentinel */ }
>  };
>  MODULE_DEVICE_TABLE(of, sun4i_lradc_of_match);
> --
> 2.11.0
>
>

-- 
You received this message because you are subscribed to the Google Groups 
"linux-sunxi" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to