[PATCH V3 14/19] OMAP3+: SR: introduce notifiers flags
Kevin Hilman
khilman at ti.com
Thu Mar 17 13:28:36 EDT 2011
Nishanth Menon <nm at ti.com> writes:
> SmartReflex IP V1 and V2 have different registers and offsets.
> Currently, we pass the status as is to the class driver. However,
> since we don't pass the version of the underlying SR hardware
> to the Class driver, it will not be unable to make consistent
> sense of the status bits coming over to it.
>
> A class driver should be able to function without dependency
> on the exact IP version it is actually running on. We hence
> introduce our own translation in software level for a generic
> notification flag.
>
> As part of this change, we will now call the notifier iff we get
> a match with the notifier flags that the class driver requested.
>
> Signed-off-by: Nishanth Menon <nm at ti.com>
Patch is mostly fine, minor coding style comments below.
Kevin
> ---
> arch/arm/mach-omap2/smartreflex.c | 73 +++++++++++++++++++++++++++++++++++--
> arch/arm/mach-omap2/smartreflex.h | 6 +++
> 2 files changed, 76 insertions(+), 3 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/smartreflex.c b/arch/arm/mach-omap2/smartreflex.c
> index d839fa6..21944e2 100644
> --- a/arch/arm/mach-omap2/smartreflex.c
> +++ b/arch/arm/mach-omap2/smartreflex.c
> @@ -123,27 +123,94 @@ static struct omap_sr *_sr_lookup(struct voltagedomain *voltdm)
> return ERR_PTR(-ENODATA);
> }
>
> +static inline u32 notifier_to_irqen_v1(u8 notify_flags)
> +{
> + u32 val;
insert blank line
> + val = (notify_flags & SR_NOTIFY_MCUACCUM) ?
> + ERRCONFIG_MCUACCUMINTEN : 0;
> + val |= (notify_flags & SR_NOTIFY_MCUVALID) ?
> + ERRCONFIG_MCUVALIDINTEN : 0;
> + val |= (notify_flags & SR_NOTIFY_MCUBOUND) ?
> + ERRCONFIG_MCUBOUNDINTEN : 0;
> + val |= (notify_flags & SR_NOTIFY_MCUDISACK) ?
> + ERRCONFIG_MCUDISACKINTEN : 0;
insert blank line
same for all tehe functions below
> + return val;
> +}
> +
> +static inline u32 notifier_to_irqen_v2(u8 notify_flags)
> +{
> + u32 val;
> + val = (notify_flags & SR_NOTIFY_MCUACCUM) ?
> + IRQENABLE_MCUACCUMINT : 0;
> + val |= (notify_flags & SR_NOTIFY_MCUVALID) ?
> + IRQENABLE_MCUVALIDINT : 0;
> + val |= (notify_flags & SR_NOTIFY_MCUBOUND) ?
> + IRQENABLE_MCUBOUNDSINT : 0;
> + val |= (notify_flags & SR_NOTIFY_MCUDISACK) ?
> + IRQENABLE_MCUDISABLEACKINT : 0;
> + return val;
> +}
> +
> +static inline u8 irqstat_to_notifier_v1(u32 status)
> +{
> + u8 val;
> + val = (status & ERRCONFIG_MCUACCUMINTST) ?
> + SR_NOTIFY_MCUACCUM : 0;
> + val |= (status & ERRCONFIG_MCUVALIDINTEN) ?
> + SR_NOTIFY_MCUVALID : 0;
> + val |= (status & ERRCONFIG_MCUBOUNDINTEN) ?
> + SR_NOTIFY_MCUBOUND : 0;
> + val |= (status & ERRCONFIG_MCUDISACKINTEN) ?
> + SR_NOTIFY_MCUDISACK : 0;
> + return val;
> +}
> +
> +static inline u8 irqstat_to_notifier_v2(u32 status)
> +{
> + u8 val;
> + val = (status & IRQENABLE_MCUACCUMINT) ?
> + SR_NOTIFY_MCUACCUM : 0;
> + val |= (status & IRQENABLE_MCUVALIDINT) ?
> + SR_NOTIFY_MCUVALID : 0;
> + val |= (status & IRQENABLE_MCUBOUNDSINT) ?
> + SR_NOTIFY_MCUBOUND : 0;
> + val |= (status & IRQENABLE_MCUDISABLEACKINT) ?
> + SR_NOTIFY_MCUDISACK : 0;
> + return val;
> +}
> +
> +
> static irqreturn_t sr_interrupt(int irq, void *data)
> {
> struct omap_sr *sr_info = (struct omap_sr *)data;
> u32 status = 0;
> + u32 value = 0;
>
> if (sr_info->ip_type == SR_TYPE_V1) {
> + /* Status bits are one bit before enable bits in v1 */
> + value = notifier_to_irqen_v1(sr_class->notify_flags) >> 1;
> +
> /* Read the status bits */
> status = sr_read_reg(sr_info, ERRCONFIG_V1);
> + status &= value;
>
> /* Clear them by writing back */
> - sr_write_reg(sr_info, ERRCONFIG_V1, status);
> + sr_modify_reg(sr_info, ERRCONFIG_V1, value, status);
> +
> + value = irqstat_to_notifier_v1(status);
> } else if (sr_info->ip_type == SR_TYPE_V2) {
> + value = notifier_to_irqen_v2(sr_class->notify_flags);
> /* Read the status bits */
> - sr_read_reg(sr_info, IRQSTATUS);
> + status = sr_read_reg(sr_info, IRQSTATUS);
> + status &= value;
>
> /* Clear them by writing back */
> sr_write_reg(sr_info, IRQSTATUS, status);
> + value = irqstat_to_notifier_v2(status);
> }
>
> if (sr_class->notify)
> - sr_class->notify(sr_info->voltdm, status);
> + sr_class->notify(sr_info->voltdm, value);
>
> return IRQ_HANDLED;
> }
> diff --git a/arch/arm/mach-omap2/smartreflex.h b/arch/arm/mach-omap2/smartreflex.h
> index d4b8bee..2976bf6 100644
> --- a/arch/arm/mach-omap2/smartreflex.h
> +++ b/arch/arm/mach-omap2/smartreflex.h
> @@ -142,6 +142,12 @@
> #define OMAP3430_SR_ERRWEIGHT 0x04
> #define OMAP3430_SR_ERRMAXLIMIT 0x02
>
> +/* Smart reflex notifiers for class drivers to use */
> +#define SR_NOTIFY_MCUDISACK BIT(3)
> +#define SR_NOTIFY_MCUBOUND BIT(2)
> +#define SR_NOTIFY_MCUVALID BIT(1)
> +#define SR_NOTIFY_MCUACCUM BIT(0)
> +
> /**
> * struct omap_sr_pmic_data - Strucutre to be populated by pmic code to pass
> * pmic specific info to smartreflex driver
More information about the linux-arm-kernel
mailing list