0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/clk.h>
0009 #include <linux/clk-provider.h>
0010 #include <linux/io.h>
0011 #include <linux/of.h>
0012 #include <linux/of_address.h>
0013 #include <linux/reset-controller.h>
0014 #include <linux/slab.h>
0015 #include <linux/spinlock.h>
0016
0017
0018
0019
0020
0021
0022 struct usb_reset_data {
0023 void __iomem *reg;
0024 spinlock_t *lock;
0025 struct clk *clk;
0026 struct reset_controller_dev rcdev;
0027 };
0028
0029 static int sunxi_usb_reset_assert(struct reset_controller_dev *rcdev,
0030 unsigned long id)
0031 {
0032 struct usb_reset_data *data = container_of(rcdev,
0033 struct usb_reset_data,
0034 rcdev);
0035 unsigned long flags;
0036 u32 reg;
0037
0038 clk_prepare_enable(data->clk);
0039 spin_lock_irqsave(data->lock, flags);
0040
0041 reg = readl(data->reg);
0042 writel(reg & ~BIT(id), data->reg);
0043
0044 spin_unlock_irqrestore(data->lock, flags);
0045 clk_disable_unprepare(data->clk);
0046
0047 return 0;
0048 }
0049
0050 static int sunxi_usb_reset_deassert(struct reset_controller_dev *rcdev,
0051 unsigned long id)
0052 {
0053 struct usb_reset_data *data = container_of(rcdev,
0054 struct usb_reset_data,
0055 rcdev);
0056 unsigned long flags;
0057 u32 reg;
0058
0059 clk_prepare_enable(data->clk);
0060 spin_lock_irqsave(data->lock, flags);
0061
0062 reg = readl(data->reg);
0063 writel(reg | BIT(id), data->reg);
0064
0065 spin_unlock_irqrestore(data->lock, flags);
0066 clk_disable_unprepare(data->clk);
0067
0068 return 0;
0069 }
0070
0071 static const struct reset_control_ops sunxi_usb_reset_ops = {
0072 .assert = sunxi_usb_reset_assert,
0073 .deassert = sunxi_usb_reset_deassert,
0074 };
0075
0076
0077
0078
0079
0080 #define SUNXI_USB_MAX_SIZE 32
0081
0082 struct usb_clk_data {
0083 u32 clk_mask;
0084 u32 reset_mask;
0085 bool reset_needs_clk;
0086 };
0087
0088 static void __init sunxi_usb_clk_setup(struct device_node *node,
0089 const struct usb_clk_data *data,
0090 spinlock_t *lock)
0091 {
0092 struct clk_onecell_data *clk_data;
0093 struct usb_reset_data *reset_data;
0094 const char *clk_parent;
0095 const char *clk_name;
0096 void __iomem *reg;
0097 int qty;
0098 int i = 0;
0099 int j = 0;
0100
0101 reg = of_io_request_and_map(node, 0, of_node_full_name(node));
0102 if (IS_ERR(reg))
0103 return;
0104
0105 clk_parent = of_clk_get_parent_name(node, 0);
0106 if (!clk_parent)
0107 return;
0108
0109
0110 qty = find_last_bit((unsigned long *)&data->clk_mask,
0111 SUNXI_USB_MAX_SIZE);
0112
0113 clk_data = kmalloc(sizeof(struct clk_onecell_data), GFP_KERNEL);
0114 if (!clk_data)
0115 return;
0116
0117 clk_data->clks = kcalloc(qty + 1, sizeof(struct clk *), GFP_KERNEL);
0118 if (!clk_data->clks) {
0119 kfree(clk_data);
0120 return;
0121 }
0122
0123 for_each_set_bit(i, (unsigned long *)&data->clk_mask,
0124 SUNXI_USB_MAX_SIZE) {
0125 of_property_read_string_index(node, "clock-output-names",
0126 j, &clk_name);
0127 clk_data->clks[i] = clk_register_gate(NULL, clk_name,
0128 clk_parent, 0,
0129 reg, i, 0, lock);
0130 WARN_ON(IS_ERR(clk_data->clks[i]));
0131
0132 j++;
0133 }
0134
0135
0136 clk_data->clk_num = i;
0137
0138 of_clk_add_provider(node, of_clk_src_onecell_get, clk_data);
0139
0140
0141 if (data->reset_mask == 0)
0142 return;
0143
0144 reset_data = kzalloc(sizeof(*reset_data), GFP_KERNEL);
0145 if (!reset_data)
0146 return;
0147
0148 if (data->reset_needs_clk) {
0149 reset_data->clk = of_clk_get(node, 0);
0150 if (IS_ERR(reset_data->clk)) {
0151 pr_err("Could not get clock for reset controls\n");
0152 kfree(reset_data);
0153 return;
0154 }
0155 }
0156
0157 reset_data->reg = reg;
0158 reset_data->lock = lock;
0159 reset_data->rcdev.nr_resets = __fls(data->reset_mask) + 1;
0160 reset_data->rcdev.ops = &sunxi_usb_reset_ops;
0161 reset_data->rcdev.of_node = node;
0162 reset_controller_register(&reset_data->rcdev);
0163 }
0164
0165 static const struct usb_clk_data sun4i_a10_usb_clk_data __initconst = {
0166 .clk_mask = BIT(8) | BIT(7) | BIT(6),
0167 .reset_mask = BIT(2) | BIT(1) | BIT(0),
0168 };
0169
0170 static DEFINE_SPINLOCK(sun4i_a10_usb_lock);
0171
0172 static void __init sun4i_a10_usb_setup(struct device_node *node)
0173 {
0174 sunxi_usb_clk_setup(node, &sun4i_a10_usb_clk_data, &sun4i_a10_usb_lock);
0175 }
0176 CLK_OF_DECLARE(sun4i_a10_usb, "allwinner,sun4i-a10-usb-clk", sun4i_a10_usb_setup);
0177
0178 static const struct usb_clk_data sun5i_a13_usb_clk_data __initconst = {
0179 .clk_mask = BIT(8) | BIT(6),
0180 .reset_mask = BIT(1) | BIT(0),
0181 };
0182
0183 static void __init sun5i_a13_usb_setup(struct device_node *node)
0184 {
0185 sunxi_usb_clk_setup(node, &sun5i_a13_usb_clk_data, &sun4i_a10_usb_lock);
0186 }
0187 CLK_OF_DECLARE(sun5i_a13_usb, "allwinner,sun5i-a13-usb-clk", sun5i_a13_usb_setup);
0188
0189 static const struct usb_clk_data sun6i_a31_usb_clk_data __initconst = {
0190 .clk_mask = BIT(18) | BIT(17) | BIT(16) | BIT(10) | BIT(9) | BIT(8),
0191 .reset_mask = BIT(2) | BIT(1) | BIT(0),
0192 };
0193
0194 static void __init sun6i_a31_usb_setup(struct device_node *node)
0195 {
0196 sunxi_usb_clk_setup(node, &sun6i_a31_usb_clk_data, &sun4i_a10_usb_lock);
0197 }
0198 CLK_OF_DECLARE(sun6i_a31_usb, "allwinner,sun6i-a31-usb-clk", sun6i_a31_usb_setup);
0199
0200 static const struct usb_clk_data sun8i_a23_usb_clk_data __initconst = {
0201 .clk_mask = BIT(16) | BIT(11) | BIT(10) | BIT(9) | BIT(8),
0202 .reset_mask = BIT(2) | BIT(1) | BIT(0),
0203 };
0204
0205 static void __init sun8i_a23_usb_setup(struct device_node *node)
0206 {
0207 sunxi_usb_clk_setup(node, &sun8i_a23_usb_clk_data, &sun4i_a10_usb_lock);
0208 }
0209 CLK_OF_DECLARE(sun8i_a23_usb, "allwinner,sun8i-a23-usb-clk", sun8i_a23_usb_setup);
0210
0211 static const struct usb_clk_data sun8i_h3_usb_clk_data __initconst = {
0212 .clk_mask = BIT(19) | BIT(18) | BIT(17) | BIT(16) |
0213 BIT(11) | BIT(10) | BIT(9) | BIT(8),
0214 .reset_mask = BIT(3) | BIT(2) | BIT(1) | BIT(0),
0215 };
0216
0217 static void __init sun8i_h3_usb_setup(struct device_node *node)
0218 {
0219 sunxi_usb_clk_setup(node, &sun8i_h3_usb_clk_data, &sun4i_a10_usb_lock);
0220 }
0221 CLK_OF_DECLARE(sun8i_h3_usb, "allwinner,sun8i-h3-usb-clk", sun8i_h3_usb_setup);
0222
0223 static const struct usb_clk_data sun9i_a80_usb_mod_data __initconst = {
0224 .clk_mask = BIT(6) | BIT(5) | BIT(4) | BIT(3) | BIT(2) | BIT(1),
0225 .reset_mask = BIT(19) | BIT(18) | BIT(17),
0226 .reset_needs_clk = 1,
0227 };
0228
0229 static DEFINE_SPINLOCK(a80_usb_mod_lock);
0230
0231 static void __init sun9i_a80_usb_mod_setup(struct device_node *node)
0232 {
0233 sunxi_usb_clk_setup(node, &sun9i_a80_usb_mod_data, &a80_usb_mod_lock);
0234 }
0235 CLK_OF_DECLARE(sun9i_a80_usb_mod, "allwinner,sun9i-a80-usb-mod-clk", sun9i_a80_usb_mod_setup);
0236
0237 static const struct usb_clk_data sun9i_a80_usb_phy_data __initconst = {
0238 .clk_mask = BIT(10) | BIT(5) | BIT(4) | BIT(3) | BIT(2) | BIT(1),
0239 .reset_mask = BIT(21) | BIT(20) | BIT(19) | BIT(18) | BIT(17),
0240 .reset_needs_clk = 1,
0241 };
0242
0243 static DEFINE_SPINLOCK(a80_usb_phy_lock);
0244
0245 static void __init sun9i_a80_usb_phy_setup(struct device_node *node)
0246 {
0247 sunxi_usb_clk_setup(node, &sun9i_a80_usb_phy_data, &a80_usb_phy_lock);
0248 }
0249 CLK_OF_DECLARE(sun9i_a80_usb_phy, "allwinner,sun9i-a80-usb-phy-clk", sun9i_a80_usb_phy_setup);