]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
clk: at91: usb: Add sam9x60 support
authorAlexandre Belloni <alexandre.belloni@bootlin.com>
Tue, 2 Apr 2019 12:50:52 +0000 (14:50 +0200)
committerStephen Boyd <sboyd@kernel.org>
Thu, 25 Apr 2019 19:34:04 +0000 (12:34 -0700)
The sam9x60 USB clock supports four different parents, ensure they can be
selected.

Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
Signed-off-by: Stephen Boyd <sboyd@kernel.org>
drivers/clk/at91/clk-usb.c
drivers/clk/at91/pmc.h

index 79ee1c760f2a5ba41a7cfaf3a7d748b30ef11f8c..ebc37ee335185849ac3a7b7e68649c15cf224739 100644 (file)
 #define RM9200_USB_DIV_SHIFT   28
 #define RM9200_USB_DIV_TAB_SIZE        4
 
+#define SAM9X5_USBS_MASK       GENMASK(0, 0)
+#define SAM9X60_USBS_MASK      GENMASK(1, 0)
+
 struct at91sam9x5_clk_usb {
        struct clk_hw hw;
        struct regmap *regmap;
+       u32 usbs_mask;
 };
 
 #define to_at91sam9x5_clk_usb(hw) \
@@ -111,8 +115,7 @@ static int at91sam9x5_clk_usb_set_parent(struct clk_hw *hw, u8 index)
        if (index > 1)
                return -EINVAL;
 
-       regmap_update_bits(usb->regmap, AT91_PMC_USB, AT91_PMC_USBS,
-                          index ? AT91_PMC_USBS : 0);
+       regmap_update_bits(usb->regmap, AT91_PMC_USB, usb->usbs_mask, index);
 
        return 0;
 }
@@ -124,7 +127,7 @@ static u8 at91sam9x5_clk_usb_get_parent(struct clk_hw *hw)
 
        regmap_read(usb->regmap, AT91_PMC_USB, &usbr);
 
-       return usbr & AT91_PMC_USBS;
+       return usbr & usb->usbs_mask;
 }
 
 static int at91sam9x5_clk_usb_set_rate(struct clk_hw *hw, unsigned long rate,
@@ -190,9 +193,10 @@ static const struct clk_ops at91sam9n12_usb_ops = {
        .set_rate = at91sam9x5_clk_usb_set_rate,
 };
 
-struct clk_hw * __init
-at91sam9x5_clk_register_usb(struct regmap *regmap, const char *name,
-                           const char **parent_names, u8 num_parents)
+static struct clk_hw * __init
+_at91sam9x5_clk_register_usb(struct regmap *regmap, const char *name,
+                            const char **parent_names, u8 num_parents,
+                            u32 usbs_mask)
 {
        struct at91sam9x5_clk_usb *usb;
        struct clk_hw *hw;
@@ -212,6 +216,7 @@ at91sam9x5_clk_register_usb(struct regmap *regmap, const char *name,
 
        usb->hw.init = &init;
        usb->regmap = regmap;
+       usb->usbs_mask = SAM9X5_USBS_MASK;
 
        hw = &usb->hw;
        ret = clk_hw_register(NULL, &usb->hw);
@@ -223,6 +228,22 @@ at91sam9x5_clk_register_usb(struct regmap *regmap, const char *name,
        return hw;
 }
 
+struct clk_hw * __init
+at91sam9x5_clk_register_usb(struct regmap *regmap, const char *name,
+                           const char **parent_names, u8 num_parents)
+{
+       return _at91sam9x5_clk_register_usb(regmap, name, parent_names,
+                                           num_parents, SAM9X5_USBS_MASK);
+}
+
+struct clk_hw * __init
+sam9x60_clk_register_usb(struct regmap *regmap, const char *name,
+                        const char **parent_names, u8 num_parents)
+{
+       return _at91sam9x5_clk_register_usb(regmap, name, parent_names,
+                                           num_parents, SAM9X60_USBS_MASK);
+}
+
 struct clk_hw * __init
 at91sam9n12_clk_register_usb(struct regmap *regmap, const char *name,
                             const char *parent_name)
index 4027306b904c67223252d9041fefabbde9d0cfba..44345e4ab1c9a90a2e94ef8f64757be2690de77f 100644 (file)
@@ -194,6 +194,9 @@ struct clk_hw * __init
 at91sam9n12_clk_register_usb(struct regmap *regmap, const char *name,
                             const char *parent_name);
 struct clk_hw * __init
+sam9x60_clk_register_usb(struct regmap *regmap, const char *name,
+                        const char **parent_names, u8 num_parents);
+struct clk_hw * __init
 at91rm9200_clk_register_usb(struct regmap *regmap, const char *name,
                            const char *parent_name, const u32 *divisors);