Lines Matching defs:lpss
31 #include "intel-lpss.h"
41 /* Offsets from lpss->priv */
131 static void intel_lpss_cache_ltr(struct intel_lpss *lpss)
133 lpss->active_ltr = readl(lpss->priv + LPSS_PRIV_ACTIVELTR);
134 lpss->idle_ltr = readl(lpss->priv + LPSS_PRIV_IDLELTR);
137 static int intel_lpss_debugfs_add(struct intel_lpss *lpss)
141 dir = debugfs_create_dir(dev_name(lpss->dev), intel_lpss_debugfs);
145 /* Cache the values into lpss structure */
146 intel_lpss_cache_ltr(lpss);
148 debugfs_create_x32("capabilities", S_IRUGO, dir, &lpss->caps);
149 debugfs_create_x32("active_ltr", S_IRUGO, dir, &lpss->active_ltr);
150 debugfs_create_x32("idle_ltr", S_IRUGO, dir, &lpss->idle_ltr);
152 lpss->debugfs = dir;
156 static void intel_lpss_debugfs_remove(struct intel_lpss *lpss)
158 debugfs_remove_recursive(lpss->debugfs);
163 struct intel_lpss *lpss = dev_get_drvdata(dev);
171 ltr = readl(lpss->priv + LPSS_PRIV_ACTIVELTR);
186 if (ltr == lpss->active_ltr)
189 writel(ltr, lpss->priv + LPSS_PRIV_ACTIVELTR);
190 writel(ltr, lpss->priv + LPSS_PRIV_IDLELTR);
192 /* Cache the values into lpss structure */
193 intel_lpss_cache_ltr(lpss);
196 static void intel_lpss_ltr_expose(struct intel_lpss *lpss)
198 lpss->dev->power.set_latency_tolerance = intel_lpss_ltr_set;
199 dev_pm_qos_expose_latency_tolerance(lpss->dev);
202 static void intel_lpss_ltr_hide(struct intel_lpss *lpss)
204 dev_pm_qos_hide_latency_tolerance(lpss->dev);
205 lpss->dev->power.set_latency_tolerance = NULL;
208 static int intel_lpss_assign_devs(struct intel_lpss *lpss)
213 type = lpss->caps & LPSS_PRIV_CAPS_TYPE_MASK;
230 lpss->cell = devm_kmemdup(lpss->dev, cell, sizeof(*cell), GFP_KERNEL);
231 if (!lpss->cell)
234 lpss->type = type;
239 static bool intel_lpss_has_idma(const struct intel_lpss *lpss)
241 return (lpss->caps & LPSS_PRIV_CAPS_NO_IDMA) == 0;
244 static void intel_lpss_set_remap_addr(const struct intel_lpss *lpss)
246 resource_size_t addr = lpss->info->mem->start;
248 lo_hi_writeq(addr, lpss->priv + LPSS_PRIV_REMAP_ADDR);
251 static void intel_lpss_deassert_reset(const struct intel_lpss *lpss)
256 writel(value, lpss->priv + LPSS_PRIV_RESETS);
259 static void intel_lpss_init_dev(const struct intel_lpss *lpss)
264 writel(0, lpss->priv + LPSS_PRIV_RESETS);
266 intel_lpss_deassert_reset(lpss);
268 intel_lpss_set_remap_addr(lpss);
270 if (!intel_lpss_has_idma(lpss))
274 if (lpss->type == LPSS_DEV_SPI)
275 writel(value, lpss->priv + LPSS_PRIV_SSP_REG);
289 static int intel_lpss_register_clock_divider(struct intel_lpss *lpss,
298 lpss->priv, 0, 0, NULL);
304 0, lpss->priv, 1, 15, 16, 15, 0,
312 CLK_SET_RATE_PARENT, lpss->priv, 31, 0, NULL);
320 static int intel_lpss_register_clock(struct intel_lpss *lpss)
322 const struct mfd_cell *cell = lpss->cell;
327 if (!lpss->info->clk_rate)
331 clk = clk_register_fixed_rate(NULL, dev_name(lpss->dev), NULL, 0,
332 lpss->info->clk_rate);
336 snprintf(devname, sizeof(devname), "%s.%d", cell->name, lpss->devid);
342 if (lpss->type != LPSS_DEV_I2C) {
343 ret = intel_lpss_register_clock_divider(lpss, devname, &clk);
351 lpss->clock = clkdev_create(clk, lpss->info->clk_con_id, "%s", devname);
352 if (!lpss->clock)
355 lpss->clk = clk;
365 static void intel_lpss_unregister_clock(struct intel_lpss *lpss)
367 if (IS_ERR_OR_NULL(lpss->clk))
370 clkdev_drop(lpss->clock);
371 intel_lpss_unregister_clock_tree(lpss->clk);
377 struct intel_lpss *lpss;
383 lpss = devm_kzalloc(dev, sizeof(*lpss), GFP_KERNEL);
384 if (!lpss)
387 lpss->priv = devm_ioremap_uc(dev, info->mem->start + LPSS_PRIV_OFFSET,
389 if (!lpss->priv)
392 lpss->info = info;
393 lpss->dev = dev;
394 lpss->caps = readl(lpss->priv + LPSS_PRIV_CAPS);
396 dev_set_drvdata(dev, lpss);
398 ret = intel_lpss_assign_devs(lpss);
402 lpss->cell->properties = info->properties;
404 intel_lpss_init_dev(lpss);
406 lpss->devid = ida_simple_get(&intel_lpss_devid_ida, 0, 0, GFP_KERNEL);
407 if (lpss->devid < 0)
408 return lpss->devid;
410 ret = intel_lpss_register_clock(lpss);
414 intel_lpss_ltr_expose(lpss);
416 ret = intel_lpss_debugfs_add(lpss);
420 if (intel_lpss_has_idma(lpss)) {
421 ret = mfd_add_devices(dev, lpss->devid, &intel_lpss_idma64_cell,
428 ret = mfd_add_devices(dev, lpss->devid, lpss->cell,
438 intel_lpss_debugfs_remove(lpss);
439 intel_lpss_ltr_hide(lpss);
440 intel_lpss_unregister_clock(lpss);
443 ida_simple_remove(&intel_lpss_devid_ida, lpss->devid);
451 struct intel_lpss *lpss = dev_get_drvdata(dev);
454 intel_lpss_debugfs_remove(lpss);
455 intel_lpss_ltr_hide(lpss);
456 intel_lpss_unregister_clock(lpss);
457 ida_simple_remove(&intel_lpss_devid_ida, lpss->devid);
482 struct intel_lpss *lpss = dev_get_drvdata(dev);
487 lpss->priv_ctx[i] = readl(lpss->priv + i * 4);
494 if (lpss->type != LPSS_DEV_UART)
495 writel(0, lpss->priv + LPSS_PRIV_RESETS);
503 struct intel_lpss *lpss = dev_get_drvdata(dev);
506 intel_lpss_deassert_reset(lpss);
510 writel(lpss->priv_ctx[i], lpss->priv + i * 4);