On 12:22-20220202, Hari Nagalla wrote:
> Add functionality to enable, set priority to the input events and to
> route to MCU ESM. On AM64x/AM62x devices, it is possible to route Main
> ESM0 error events to MCU ESM. When these error events are routed to MCU
> ESM high output, it can trigger the reset logic to reset the device,
> when CTRLMMR_MCU_RST_CTRL:MCU_ESM_ERROR_RESET_EN_Z is set to '0'.
> 

Since this driver is common, it will be good to also highlight that
existing devices (such as J7* SoCs) which use the same driver is not
impacted by this change.

> Signed-off-by: Hari Nagalla <hnaga...@ti.com>
> ---
>  drivers/misc/k3_esm.c | 53 ++++++++++++++++++++++++++++++++++++++++---
>  1 file changed, 50 insertions(+), 3 deletions(-)
> 
> diff --git a/drivers/misc/k3_esm.c b/drivers/misc/k3_esm.c
> index cc2a23dd66..41faeb3d85 100644
> --- a/drivers/misc/k3_esm.c
> +++ b/drivers/misc/k3_esm.c
> @@ -16,17 +16,57 @@
>  
>  #define ESM_SFT_RST                  0x0c
>  #define ESM_SFT_RST_KEY                      0x0f
> +#define ESM_EN                               0x08
> +#define ESM_EN_KEY                   0x0f
>  
>  #define ESM_STS(i)                   (0x404 + (i) / 32 * 0x20)
> +#define ESM_STS_MASK(i)                      (1 << ((i) % 32))
>  #define ESM_PIN_EN_SET_OFFSET(i)     (0x414 + (i) / 32 * 0x20)
> -#define ESM_PIN_MASK(i)                      BIT((i) & 0x1f)
> +#define ESM_PIN_MASK(i)                      (1 << ((i) % 32))
> +#define ESM_INTR_EN_SET_OFFSET(i)    (0x408 + (i) / 32 * 0x20)
> +#define ESM_INTR_MASK(i)             (1 << ((i) % 32))
> +#define ESM_INTR_PRIO_SET_OFFSET(i)  (0x410 + (i) / 32 * 0x20)
> +#define ESM_INTR_PRIO_MASK(i)                (1 << ((i) % 32))
>  
>  static void esm_pin_enable(void __iomem *base, int pin)
>  {
> +     u32 value;
> +
> +     value = readl(base + ESM_PIN_EN_SET_OFFSET(pin));
> +     value |= ESM_PIN_MASK(pin);
>       /* Enable event */
> -     writel(ESM_PIN_MASK(pin), base + ESM_PIN_EN_SET_OFFSET(pin));
> +     writel(value, base + ESM_PIN_EN_SET_OFFSET(pin));
> +}
> +
> +static void esm_intr_enable(void __iomem *base, int pin)
> +{
> +     u32 value;
> +
> +     value = readl(base + ESM_INTR_EN_SET_OFFSET(pin));
> +     value |= ESM_INTR_MASK(pin);
> +     /* Enable Interrupt event */
> +     writel(value, base + ESM_INTR_EN_SET_OFFSET(pin));
> +}
> +
> +static void esm_intr_prio_set(void __iomem *base, int pin)
> +{
> +     u32 value;
> +
> +     value = readl(base + ESM_INTR_PRIO_SET_OFFSET(pin));
> +     value |= ESM_INTR_PRIO_MASK(pin);
> +     /* Set to priority */
> +     writel(value, base + ESM_INTR_PRIO_SET_OFFSET(pin));
>  }
>  
> +static void esm_clear_raw_status(void __iomem *base, int pin)
> +{
> +     u32 value;
> +
> +     value = readl(base + ESM_STS(pin));
> +     value |= ESM_STS_MASK(pin);
> +     /* Clear Event status */
> +     writel(value, base + ESM_STS(pin));
> +}
>  /**
>   * k3_esm_probe: configures ESM based on DT data
>   *
> @@ -67,8 +107,15 @@ static int k3_esm_probe(struct udevice *dev)
>       /* Clear any pending events */
>       writel(ESM_SFT_RST_KEY, base + ESM_SFT_RST);
>  
> -     for (i = 0; i < num_pins; i++)
> +     for (i = 0; i < num_pins; i++) {
> +             esm_intr_prio_set(base, pins[i]);
> +             esm_clear_raw_status(base, pins[i]);
>               esm_pin_enable(base, pins[i]);
> +             esm_intr_enable(base, pins[i]);
> +     }
> +
> +     /* Enable ESM */
> +     writel(ESM_EN_KEY, base + ESM_EN);
>  
>  free_pins:
>       kfree(pins);
> -- 
> 2.17.1
> 

-- 
Regards,
Nishanth Menon
Key (0xDDB5849D1736249D)/Fingerprint: F8A2 8693 54EB 8232 17A3  1A34 DDB5 849D 
1736 249D

Reply via email to