Lines Matching +full:kirin970 +full:- +full:spmi +full:- +full:controller
1 // SPDX-License-Identifier: GPL-2.0
13 #include <linux/spmi.h>
16 * SPMI register addr
37 * SPMI cmd register
62 * SPMI status register
75 struct spmi_controller *controller; member
90 offset += SPMI_CHANNEL_OFFSET * ctrl_dev->channel + SPMI_SLAVE_OFFSET * sid; in spmi_controller_wait_for_done()
99 return -EIO; in spmi_controller_wait_for_done()
105 } while (timeout--); in spmi_controller_wait_for_done()
108 return -ETIMEDOUT; in spmi_controller_wait_for_done()
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()
178 "spmi read wait timeout op:0x%x slave_id:%d slave_addr:0x%x bc:%zu\n", in spmi_read_cmd()
181 dev_dbg(&ctrl->dev, "%s: id:%d slave_addr:0x%x, read value: %*ph\n", in spmi_read_cmd()
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()
270 ctrl = spmi_controller_alloc(&pdev->dev, sizeof(*spmi_controller)); 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()
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->nr = spmi_controller->channel; in spmi_controller_probe()
307 ctrl->dev.parent = pdev->dev.parent; in spmi_controller_probe()
308 ctrl->dev.of_node = of_node_get(pdev->dev.of_node); in spmi_controller_probe()
311 ctrl->read_cmd = spmi_read_cmd; in spmi_controller_probe()
312 ctrl->write_cmd = spmi_write_cmd; in spmi_controller_probe()
316 dev_err(&pdev->dev, "spmi_controller_add failed with error %d!\n", ret); in spmi_controller_probe()
338 .compatible = "hisilicon,kirin970-spmi-controller",