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,
313 CLK_SET_RATE_PARENT, lpss->priv, 31, 0, NULL);
321 static int intel_lpss_register_clock(struct intel_lpss *lpss)
323 const struct mfd_cell *cell = lpss->cell;
328 if (!lpss->info->clk_rate)
332 clk = clk_register_fixed_rate(NULL, dev_name(lpss->dev), NULL, 0,
333 lpss->info->clk_rate);
337 snprintf(devname, sizeof(devname), "%s.%d", cell->name, lpss->devid);
343 if (lpss->type != LPSS_DEV_I2C) {
344 ret = intel_lpss_register_clock_divider(lpss, devname, &clk);
352 lpss->clock = clkdev_create(clk, lpss->info->clk_con_id, "%s", devname);
353 if (!lpss->clock)
356 lpss->clk = clk;
366 static void intel_lpss_unregister_clock(struct intel_lpss *lpss)
368 if (IS_ERR_OR_NULL(lpss->clk))
371 clkdev_drop(lpss->clock);
372 intel_lpss_unregister_clock_tree(lpss->clk);
378 struct intel_lpss *lpss;
384 lpss = devm_kzalloc(dev, sizeof(*lpss), GFP_KERNEL);
385 if (!lpss)
388 lpss->priv = devm_ioremap_uc(dev, info->mem->start + LPSS_PRIV_OFFSET,
390 if (!lpss->priv)
393 lpss->info = info;
394 lpss->dev = dev;
395 lpss->caps = readl(lpss->priv + LPSS_PRIV_CAPS);
397 dev_set_drvdata(dev, lpss);
399 ret = intel_lpss_assign_devs(lpss);
403 lpss->cell->swnode = info->swnode;
404 lpss->cell->ignore_resource_conflicts = info->ignore_resource_conflicts;
406 intel_lpss_init_dev(lpss);
408 lpss->devid = ida_simple_get(&intel_lpss_devid_ida, 0, 0, GFP_KERNEL);
409 if (lpss->devid < 0)
410 return lpss->devid;
412 ret = intel_lpss_register_clock(lpss);
416 intel_lpss_ltr_expose(lpss);
418 ret = intel_lpss_debugfs_add(lpss);
422 if (intel_lpss_has_idma(lpss)) {
423 ret = mfd_add_devices(dev, lpss->devid, &intel_lpss_idma64_cell,
430 ret = mfd_add_devices(dev, lpss->devid, lpss->cell,
440 intel_lpss_debugfs_remove(lpss);
441 intel_lpss_ltr_hide(lpss);
442 intel_lpss_unregister_clock(lpss);
445 ida_simple_remove(&intel_lpss_devid_ida, lpss->devid);
453 struct intel_lpss *lpss = dev_get_drvdata(dev);
456 intel_lpss_debugfs_remove(lpss);
457 intel_lpss_ltr_hide(lpss);
458 intel_lpss_unregister_clock(lpss);
459 ida_simple_remove(&intel_lpss_devid_ida, lpss->devid);
485 struct intel_lpss *lpss = dev_get_drvdata(dev);
490 lpss->priv_ctx[i] = readl(lpss->priv + i * 4);
497 if (lpss->type != LPSS_DEV_UART)
498 writel(0, lpss->priv + LPSS_PRIV_RESETS);
506 struct intel_lpss *lpss = dev_get_drvdata(dev);
509 intel_lpss_deassert_reset(lpss);
513 writel(lpss->priv_ctx[i], lpss->priv + i * 4);