Lines Matching +full:pwr +full:- +full:reg
1 // SPDX-License-Identifier: GPL-2.0-only
14 * pci_platform_pm_ops (see drivers/pci/pci-mid.c).
27 #include <asm/intel-mid.h>
106 static u32 mid_pwr_get_state(struct mid_pwr *pwr, int reg) in mid_pwr_get_state() argument
108 return readl(pwr->regs + PM_SSS(reg)); in mid_pwr_get_state()
111 static void mid_pwr_set_state(struct mid_pwr *pwr, int reg, u32 value) in mid_pwr_set_state() argument
113 writel(value, pwr->regs + PM_SSC(reg)); in mid_pwr_set_state()
116 static void mid_pwr_set_wake(struct mid_pwr *pwr, int reg, u32 value) in mid_pwr_set_wake() argument
118 writel(value, pwr->regs + PM_WKC(reg)); in mid_pwr_set_wake()
121 static void mid_pwr_interrupt_disable(struct mid_pwr *pwr) in mid_pwr_interrupt_disable() argument
123 writel(~PM_ICS_IE, pwr->regs + PM_ICS); in mid_pwr_interrupt_disable()
126 static bool mid_pwr_is_busy(struct mid_pwr *pwr) in mid_pwr_is_busy() argument
128 return !!(readl(pwr->regs + PM_STS) & PM_STS_BUSY); in mid_pwr_is_busy()
132 static int mid_pwr_wait(struct mid_pwr *pwr) in mid_pwr_wait() argument
138 busy = mid_pwr_is_busy(pwr); in mid_pwr_wait()
142 } while (--count); in mid_pwr_wait()
144 return -EBUSY; in mid_pwr_wait()
147 static int mid_pwr_wait_for_cmd(struct mid_pwr *pwr, u8 cmd) in mid_pwr_wait_for_cmd() argument
149 writel(PM_CMD_CMD(cmd) | PM_CMD_CM_IMMEDIATE, pwr->regs + PM_CMD); in mid_pwr_wait_for_cmd()
150 return mid_pwr_wait(pwr); in mid_pwr_wait_for_cmd()
153 static int __update_power_state(struct mid_pwr *pwr, int reg, int bit, int new) in __update_power_state() argument
160 power = mid_pwr_get_state(pwr, reg); in __update_power_state()
166 mid_pwr_set_state(pwr, reg, (power & ~(3 << bit)) | (new << bit)); in __update_power_state()
169 ret = mid_pwr_wait_for_cmd(pwr, CMD_SET_CFG); in __update_power_state()
174 power = mid_pwr_get_state(pwr, reg); in __update_power_state()
177 return -EAGAIN; in __update_power_state()
200 dev_WARN(&pdev->dev, "No room for device in PWRMU LSS cache\n"); in __find_weakest_power_state()
213 static int __set_power_state(struct mid_pwr *pwr, struct pci_dev *pdev, in __set_power_state() argument
214 pci_power_t state, int id, int reg, int bit) in __set_power_state() argument
219 state = __find_weakest_power_state(pwr->lss[id], pdev, state); in __set_power_state()
222 ret = __update_power_state(pwr, reg, bit, (__force int)state); in __set_power_state()
224 dev_warn(&pdev->dev, "Can't set power state %s: %d\n", name, ret); in __set_power_state()
228 dev_vdbg(&pdev->dev, "Set power state %s\n", name); in __set_power_state()
232 static int mid_pwr_set_power_state(struct mid_pwr *pwr, struct pci_dev *pdev, in mid_pwr_set_power_state() argument
235 int id, reg, bit; in mid_pwr_set_power_state() local
242 reg = (id * LSS_PWS_BITS) / 32; in mid_pwr_set_power_state()
251 mutex_lock(&pwr->lock); in mid_pwr_set_power_state()
252 ret = __set_power_state(pwr, pdev, state, id, reg, bit); in mid_pwr_set_power_state()
253 mutex_unlock(&pwr->lock); in mid_pwr_set_power_state()
259 struct mid_pwr *pwr = midpwr; in intel_mid_pci_set_power_state() local
264 if (pwr && pwr->available) in intel_mid_pci_set_power_state()
265 ret = mid_pwr_set_power_state(pwr, pdev, state); in intel_mid_pci_set_power_state()
266 dev_vdbg(&pdev->dev, "set_power_state() returns %d\n", ret); in intel_mid_pci_set_power_state()
273 struct mid_pwr *pwr = midpwr; in intel_mid_pci_get_power_state() local
274 int id, reg, bit; in intel_mid_pci_get_power_state() local
277 if (!pwr || !pwr->available) in intel_mid_pci_get_power_state()
284 reg = (id * LSS_PWS_BITS) / 32; in intel_mid_pci_get_power_state()
286 power = mid_pwr_get_state(pwr, reg); in intel_mid_pci_get_power_state()
292 struct mid_pwr *pwr = midpwr; in intel_mid_pwr_power_off() local
300 writel(cmd, pwr->regs + PM_CMD); in intel_mid_pwr_power_off()
301 mid_pwr_wait(pwr); in intel_mid_pwr_power_off()
315 return -EINVAL; in intel_mid_pwr_get_lss_id()
320 return -ENODEV; in intel_mid_pwr_get_lss_id()
324 return -ERANGE; in intel_mid_pwr_get_lss_id()
331 struct mid_pwr *pwr = dev_id; in mid_pwr_irq_handler() local
334 ics = readl(pwr->regs + PM_ICS); in mid_pwr_irq_handler()
338 writel(ics | PM_ICS_IP, pwr->regs + PM_ICS); in mid_pwr_irq_handler()
340 dev_warn(pwr->dev, "Unexpected IRQ: %#x\n", PM_ICS_INT_STATUS(ics)); in mid_pwr_irq_handler()
345 int (*set_initial_state)(struct mid_pwr *pwr);
350 struct mid_pwr_device_info *info = (void *)id->driver_data; in mid_pwr_probe()
351 struct device *dev = &pdev->dev; in mid_pwr_probe()
352 struct mid_pwr *pwr; in mid_pwr_probe() local
357 dev_err(&pdev->dev, "error: could not enable device\n"); in mid_pwr_probe()
363 dev_err(&pdev->dev, "I/O memory remapping failed\n"); in mid_pwr_probe()
367 pwr = devm_kzalloc(dev, sizeof(*pwr), GFP_KERNEL); in mid_pwr_probe()
368 if (!pwr) in mid_pwr_probe()
369 return -ENOMEM; in mid_pwr_probe()
371 pwr->dev = dev; in mid_pwr_probe()
372 pwr->regs = pcim_iomap_table(pdev)[0]; in mid_pwr_probe()
373 pwr->irq = pdev->irq; in mid_pwr_probe()
375 mutex_init(&pwr->lock); in mid_pwr_probe()
378 mid_pwr_interrupt_disable(pwr); in mid_pwr_probe()
380 if (info && info->set_initial_state) { in mid_pwr_probe()
381 ret = info->set_initial_state(pwr); in mid_pwr_probe()
386 ret = devm_request_irq(dev, pdev->irq, mid_pwr_irq_handler, in mid_pwr_probe()
387 IRQF_NO_SUSPEND, pci_name(pdev), pwr); in mid_pwr_probe()
391 pwr->available = true; in mid_pwr_probe()
392 midpwr = pwr; in mid_pwr_probe()
394 pci_set_drvdata(pdev, pwr); in mid_pwr_probe()
398 static int mid_set_initial_state(struct mid_pwr *pwr, const u32 *states) in mid_set_initial_state() argument
409 mid_pwr_set_wake(pwr, 0, 0xffffffff); in mid_set_initial_state()
410 mid_pwr_set_wake(pwr, 1, 0xffffffff); in mid_set_initial_state()
416 * on 32-bit HW registers. The following calls set all devices to one in mid_set_initial_state()
423 mid_pwr_set_state(pwr, 0, states[0]); in mid_set_initial_state()
424 mid_pwr_set_state(pwr, 1, states[1]); in mid_set_initial_state()
425 mid_pwr_set_state(pwr, 2, states[2]); in mid_set_initial_state()
426 mid_pwr_set_state(pwr, 3, states[3]); in mid_set_initial_state()
429 ret = mid_pwr_wait_for_cmd(pwr, CMD_SET_CFG); in mid_set_initial_state()
435 pwr->lss[i][j].state = PCI_D3hot; in mid_set_initial_state()
441 static int pnw_set_initial_state(struct mid_pwr *pwr) in pnw_set_initial_state() argument
450 return mid_set_initial_state(pwr, states); in pnw_set_initial_state()
453 static int tng_set_initial_state(struct mid_pwr *pwr) in tng_set_initial_state() argument
461 return mid_set_initial_state(pwr, states); in tng_set_initial_state()
472 /* This table should be in sync with the one in drivers/pci/pci-mid.c */