pinctrl: sh-pfc: Add helper to handle bias lookup table
authorNiklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Sat, 12 Nov 2016 16:04:25 +0000 (17:04 +0100)
committerGeert Uytterhoeven <geert+renesas@glider.be>
Tue, 15 Nov 2016 10:01:09 +0000 (11:01 +0100)
On some SoC there are no simple mapping of pins to bias register bits
and a lookup table is needed. This logic is already implemented in some
SoC specific drivers that could benefit from a generic implementation.

Add helpers to deal with the lookup which later can be used by the SoC
specific drivers. The logic used to lookup are different from the one it
aims to replace, this is intentional. This new method reduces the memory
consumption at the cost of increased CPU usage and fix a bug where a
WARN() would incorrectly be triggered if the register offset is 0.

Signed-off-by: Niklas Söderlund <niklas.soderlund+renesas@ragnatech.se>
Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
drivers/pinctrl/sh-pfc/core.c
drivers/pinctrl/sh-pfc/core.h
drivers/pinctrl/sh-pfc/sh_pfc.h

index f3a8897d4e8f407f04980c8c404b0e5c4643ec2e..cf80ce1dd7cea5a0fdd9c524a6c5a03e1d93e0f2 100644 (file)
@@ -389,6 +389,21 @@ int sh_pfc_config_mux(struct sh_pfc *pfc, unsigned mark, int pinmux_type)
        return 0;
 }
 
+const struct sh_pfc_bias_info *
+sh_pfc_pin_to_bias_info(const struct sh_pfc_bias_info *info,
+                       unsigned int num, unsigned int pin)
+{
+       unsigned int i;
+
+       for (i = 0; i < num; i++)
+               if (info[i].pin == pin)
+                       return &info[i];
+
+       WARN_ONCE(1, "Pin %u is not in bias info list\n", pin);
+
+       return NULL;
+}
+
 static int sh_pfc_init_ranges(struct sh_pfc *pfc)
 {
        struct sh_pfc_pin_range *range;
index 0bbdea5849f41713a135b5dd3ae6bc810717e2b3..6d598dd63720856774c0f7b2267f631fc67204a0 100644 (file)
@@ -33,4 +33,8 @@ void sh_pfc_write_reg(struct sh_pfc *pfc, u32 reg, unsigned int width,
 int sh_pfc_get_pin_index(struct sh_pfc *pfc, unsigned int pin);
 int sh_pfc_config_mux(struct sh_pfc *pfc, unsigned mark, int pinmux_type);
 
+const struct sh_pfc_bias_info *
+sh_pfc_pin_to_bias_info(const struct sh_pfc_bias_info *info,
+                       unsigned int num, unsigned int pin);
+
 #endif /* __SH_PFC_CORE_H__ */
index 2345421103db342e537187380f088240e3b1bf59..9556c172e3d2085cc846c976e62c15d8fb9cd5cb 100644 (file)
@@ -189,6 +189,12 @@ struct sh_pfc_window {
        unsigned long size;
 };
 
+struct sh_pfc_bias_info {
+       u16 pin;
+       u16 reg : 11;
+       u16 bit : 5;
+};
+
 struct sh_pfc_pin_range;
 
 struct sh_pfc {