Lines Matching +full:clkreq +full:- +full:mode
1 // SPDX-License-Identifier: GPL-2.0
18 #include <dt-bindings/soc/samsung,exynos-usi.h>
55 enum exynos_usi_ver ver; /* USI IP-core version */
68 size_t mode; /* current USI SW_CONF mode index */ member
79 const char *name; /* mode name */
80 unsigned int val; /* mode register value */
122 .compatible = "samsung,exynos850-usi",
125 .compatible = "samsung,exynos8895-usi",
133 * exynos_usi_set_sw_conf - Set USI block configuration mode
135 * @mode: Mode index
137 * Select underlying serial protocol (UART/SPI/I2C) in USI IP-core.
141 static int exynos_usi_set_sw_conf(struct exynos_usi *usi, size_t mode) in exynos_usi_set_sw_conf() argument
146 if (mode < usi->data->min_mode || mode > usi->data->max_mode) in exynos_usi_set_sw_conf()
147 return -EINVAL; in exynos_usi_set_sw_conf()
149 val = exynos_usi_modes[usi->data->ver][mode].val; in exynos_usi_set_sw_conf()
150 ret = regmap_update_bits(usi->sysreg, usi->sw_conf, in exynos_usi_set_sw_conf()
151 usi->data->sw_conf_mask, val); in exynos_usi_set_sw_conf()
155 usi->mode = mode; in exynos_usi_set_sw_conf()
156 dev_dbg(usi->dev, "protocol: %s\n", in exynos_usi_set_sw_conf()
157 exynos_usi_modes[usi->data->ver][usi->mode].name); in exynos_usi_set_sw_conf()
163 * exynos_usi_enable - Initialize USI block
166 * USI IP-core start state is "reset" (on startup and after CPU resume). This
178 ret = clk_bulk_prepare_enable(usi->data->num_clks, usi->clks); in exynos_usi_enable()
183 val = readl(usi->regs + USI_CON); in exynos_usi_enable()
185 writel(val, usi->regs + USI_CON); in exynos_usi_enable()
189 if (usi->clkreq_on) { in exynos_usi_enable()
190 val = readl(usi->regs + USI_OPTION); in exynos_usi_enable()
193 writel(val, usi->regs + USI_OPTION); in exynos_usi_enable()
196 clk_bulk_disable_unprepare(usi->data->num_clks, usi->clks); in exynos_usi_enable()
205 ret = exynos_usi_set_sw_conf(usi, usi->mode); in exynos_usi_configure()
209 if (usi->data->ver == USI_VER1) in exynos_usi_configure()
210 ret = clk_bulk_prepare_enable(usi->data->num_clks, in exynos_usi_configure()
211 usi->clks); in exynos_usi_configure()
212 else if (usi->data->ver == USI_VER2) in exynos_usi_configure()
224 if (usi->data->ver == USI_VER1) { in exynos_usi_unconfigure()
225 clk_bulk_disable_unprepare(usi->data->num_clks, usi->clks); in exynos_usi_unconfigure()
229 ret = clk_bulk_prepare_enable(usi->data->num_clks, usi->clks); in exynos_usi_unconfigure()
234 val = readl(usi->regs + USI_OPTION); in exynos_usi_unconfigure()
237 writel(val, usi->regs + USI_OPTION); in exynos_usi_unconfigure()
240 val = readl(usi->regs + USI_CON); in exynos_usi_unconfigure()
242 writel(val, usi->regs + USI_CON); in exynos_usi_unconfigure()
244 clk_bulk_disable_unprepare(usi->data->num_clks, usi->clks); in exynos_usi_unconfigure()
250 u32 mode; in exynos_usi_parse_dt() local
252 ret = of_property_read_u32(np, "samsung,mode", &mode); in exynos_usi_parse_dt()
255 if (mode < usi->data->min_mode || mode > usi->data->max_mode) in exynos_usi_parse_dt()
256 return -EINVAL; in exynos_usi_parse_dt()
257 usi->mode = mode; in exynos_usi_parse_dt()
259 usi->sysreg = syscon_regmap_lookup_by_phandle_args(np, "samsung,sysreg", in exynos_usi_parse_dt()
260 1, &usi->sw_conf); in exynos_usi_parse_dt()
261 if (IS_ERR(usi->sysreg)) in exynos_usi_parse_dt()
262 return PTR_ERR(usi->sysreg); in exynos_usi_parse_dt()
264 usi->clkreq_on = of_property_read_bool(np, "samsung,clkreq-on"); in exynos_usi_parse_dt()
271 const size_t num = usi->data->num_clks; in exynos_usi_get_clocks()
272 struct device *dev = usi->dev; in exynos_usi_get_clocks()
278 usi->clks = devm_kcalloc(dev, num, sizeof(*usi->clks), GFP_KERNEL); in exynos_usi_get_clocks()
279 if (!usi->clks) in exynos_usi_get_clocks()
280 return -ENOMEM; in exynos_usi_get_clocks()
283 usi->clks[i].id = usi->data->clk_names[i]; in exynos_usi_get_clocks()
285 return devm_clk_bulk_get(dev, num, usi->clks); in exynos_usi_get_clocks()
290 struct device *dev = &pdev->dev; in exynos_usi_probe()
291 struct device_node *np = dev->of_node; in exynos_usi_probe()
297 return -ENOMEM; in exynos_usi_probe()
299 usi->dev = dev; in exynos_usi_probe()
302 usi->data = of_device_get_match_data(dev); in exynos_usi_probe()
303 if (!usi->data) in exynos_usi_probe()
304 return -EINVAL; in exynos_usi_probe()
314 if (usi->data->ver == USI_VER2) { in exynos_usi_probe()
315 usi->regs = devm_platform_ioremap_resource(pdev, 0); in exynos_usi_probe()
316 if (IS_ERR(usi->regs)) in exynos_usi_probe()
317 return PTR_ERR(usi->regs); in exynos_usi_probe()
324 ret = devm_add_action_or_reset(&pdev->dev, exynos_usi_unconfigure, usi); in exynos_usi_probe()
345 .name = "exynos-usi",