Lines Matching +full:dev +full:- +full:ctrl
1 // SPDX-License-Identifier: GPL-2.0
76 struct device *dev; member
82 static int spmi_controller_wait_for_done(struct device *dev, in spmi_controller_wait_for_done() argument
90 offset += SPMI_CHANNEL_OFFSET * ctrl_dev->channel + SPMI_SLAVE_OFFSET * sid; in spmi_controller_wait_for_done()
97 dev_err(dev, "%s: transaction failed (0x%x)\n", in spmi_controller_wait_for_done()
99 return -EIO; in spmi_controller_wait_for_done()
101 dev_dbg(dev, "%s: status 0x%x\n", __func__, status); in spmi_controller_wait_for_done()
105 } while (timeout--); in spmi_controller_wait_for_done()
107 dev_err(dev, "%s: timeout, status 0x%x\n", __func__, status); in spmi_controller_wait_for_done()
108 return -ETIMEDOUT; in spmi_controller_wait_for_done()
111 static int spmi_read_cmd(struct spmi_controller *ctrl, in spmi_read_cmd() argument
114 struct spmi_controller_dev *spmi_controller = dev_get_drvdata(&ctrl->dev); in spmi_read_cmd()
115 u32 chnl_ofst = SPMI_CHANNEL_OFFSET * spmi_controller->channel; in spmi_read_cmd()
123 dev_err(&ctrl->dev, in spmi_read_cmd()
126 return -EINVAL; in spmi_read_cmd()
140 dev_err(&ctrl->dev, "invalid read cmd 0x%x\n", opc); in spmi_read_cmd()
141 return -EINVAL; in spmi_read_cmd()
146 ((bc - 1) << SPMI_APB_SPMI_CMD_LENGTH_OFFSET) | in spmi_read_cmd()
150 spin_lock_irqsave(&spmi_controller->lock, flags); in spmi_read_cmd()
152 writel(cmd, spmi_controller->base + chnl_ofst + SPMI_APB_SPMI_CMD_BASE_ADDR); in spmi_read_cmd()
154 rc = spmi_controller_wait_for_done(&ctrl->dev, spmi_controller, in spmi_read_cmd()
155 spmi_controller->base, slave_id, slave_addr); in spmi_read_cmd()
160 data = readl(spmi_controller->base + chnl_ofst + in spmi_read_cmd()
165 if ((bc - i * SPMI_PER_DATAREG_BYTE) >> 2) { in spmi_read_cmd()
175 spin_unlock_irqrestore(&spmi_controller->lock, flags); in spmi_read_cmd()
177 dev_err(&ctrl->dev, in spmi_read_cmd()
181 dev_dbg(&ctrl->dev, "%s: id:%d slave_addr:0x%x, read value: %*ph\n", in spmi_read_cmd()
187 static int spmi_write_cmd(struct spmi_controller *ctrl, in spmi_write_cmd() argument
190 struct spmi_controller_dev *spmi_controller = dev_get_drvdata(&ctrl->dev); in spmi_write_cmd()
191 u32 chnl_ofst = SPMI_CHANNEL_OFFSET * spmi_controller->channel; in spmi_write_cmd()
199 dev_err(&ctrl->dev, in spmi_write_cmd()
202 return -EINVAL; in spmi_write_cmd()
216 dev_err(&ctrl->dev, "invalid write cmd 0x%x\n", opc); in spmi_write_cmd()
217 return -EINVAL; in spmi_write_cmd()
222 ((bc - 1) << SPMI_APB_SPMI_CMD_LENGTH_OFFSET) | in spmi_write_cmd()
227 spin_lock_irqsave(&spmi_controller->lock, flags); in spmi_write_cmd()
231 if ((bc - i * SPMI_PER_DATAREG_BYTE) >> 2) { in spmi_write_cmd()
240 spmi_controller->base + chnl_ofst + in spmi_write_cmd()
246 writel(cmd, spmi_controller->base + chnl_ofst + SPMI_APB_SPMI_CMD_BASE_ADDR); in spmi_write_cmd()
248 rc = spmi_controller_wait_for_done(&ctrl->dev, spmi_controller, in spmi_write_cmd()
249 spmi_controller->base, slave_id, in spmi_write_cmd()
251 spin_unlock_irqrestore(&spmi_controller->lock, flags); in spmi_write_cmd()
254 dev_err(&ctrl->dev, "spmi write wait timeout op:0x%x slave_id:%d slave_addr:0x%x bc:%zu\n", in spmi_write_cmd()
257 dev_dbg(&ctrl->dev, "%s: id:%d slave_addr:0x%x, wrote value: %*ph\n", in spmi_write_cmd()
266 struct spmi_controller *ctrl; in spmi_controller_probe() local
270 ctrl = spmi_controller_alloc(&pdev->dev, sizeof(*spmi_controller)); in spmi_controller_probe()
271 if (!ctrl) { in spmi_controller_probe()
272 dev_err(&pdev->dev, "can not allocate spmi_controller data\n"); in spmi_controller_probe()
273 return -ENOMEM; in spmi_controller_probe()
275 spmi_controller = spmi_controller_get_drvdata(ctrl); in spmi_controller_probe()
276 spmi_controller->controller = ctrl; in spmi_controller_probe()
280 dev_err(&pdev->dev, "can not get resource!\n"); in spmi_controller_probe()
281 ret = -EINVAL; in spmi_controller_probe()
285 spmi_controller->base = devm_ioremap(&pdev->dev, iores->start, in spmi_controller_probe()
287 if (!spmi_controller->base) { in spmi_controller_probe()
288 dev_err(&pdev->dev, "can not remap base addr!\n"); in spmi_controller_probe()
289 ret = -EADDRNOTAVAIL; in spmi_controller_probe()
293 ret = of_property_read_u32(pdev->dev.of_node, "hisilicon,spmi-channel", in spmi_controller_probe()
294 &spmi_controller->channel); in spmi_controller_probe()
296 dev_err(&pdev->dev, "can not get channel\n"); in spmi_controller_probe()
297 ret = -ENODEV; in spmi_controller_probe()
302 dev_set_drvdata(&ctrl->dev, spmi_controller); in spmi_controller_probe()
304 spin_lock_init(&spmi_controller->lock); in spmi_controller_probe()
306 ctrl->dev.parent = pdev->dev.parent; in spmi_controller_probe()
307 ctrl->dev.of_node = of_node_get(pdev->dev.of_node); in spmi_controller_probe()
310 ctrl->read_cmd = spmi_read_cmd; in spmi_controller_probe()
311 ctrl->write_cmd = spmi_write_cmd; in spmi_controller_probe()
313 ret = spmi_controller_add(ctrl); in spmi_controller_probe()
315 dev_err(&pdev->dev, "spmi_controller_add failed with error %d!\n", ret); in spmi_controller_probe()
322 spmi_controller_put(ctrl); in spmi_controller_probe()
328 struct spmi_controller *ctrl = platform_get_drvdata(pdev); in spmi_del_controller() local
330 spmi_controller_remove(ctrl); in spmi_del_controller()
331 spmi_controller_put(ctrl); in spmi_del_controller()
336 .compatible = "hisilicon,kirin970-spmi-controller",