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