Lines Matching refs:ssbi

22 #include <linux/ssbi.h>
66 struct ssbi {
71 int (*read)(struct ssbi *, u16 addr, u8 *buf, int len);
72 int (*write)(struct ssbi *, u16 addr, const u8 *buf, int len);
75 static inline u32 ssbi_readl(struct ssbi *ssbi, u32 reg)
77 return readl(ssbi->base + reg);
80 static inline void ssbi_writel(struct ssbi *ssbi, u32 val, u32 reg)
82 writel(val, ssbi->base + reg);
94 static int ssbi_wait_mask(struct ssbi *ssbi, u32 set_mask, u32 clr_mask)
100 val = ssbi_readl(ssbi, SSBI2_STATUS);
110 ssbi_read_bytes(struct ssbi *ssbi, u16 addr, u8 *buf, int len)
115 if (ssbi->controller_type == MSM_SBI_CTRL_SSBI2) {
116 u32 mode2 = ssbi_readl(ssbi, SSBI2_MODE2);
118 ssbi_writel(ssbi, mode2, SSBI2_MODE2);
122 ret = ssbi_wait_mask(ssbi, SSBI_STATUS_READY, 0);
126 ssbi_writel(ssbi, cmd, SSBI2_CMD);
127 ret = ssbi_wait_mask(ssbi, SSBI_STATUS_RD_READY, 0);
130 *buf++ = ssbi_readl(ssbi, SSBI2_RD) & 0xff;
139 ssbi_write_bytes(struct ssbi *ssbi, u16 addr, const u8 *buf, int len)
143 if (ssbi->controller_type == MSM_SBI_CTRL_SSBI2) {
144 u32 mode2 = ssbi_readl(ssbi, SSBI2_MODE2);
146 ssbi_writel(ssbi, mode2, SSBI2_MODE2);
150 ret = ssbi_wait_mask(ssbi, SSBI_STATUS_READY, 0);
154 ssbi_writel(ssbi, ((addr & 0xff) << 16) | *buf, SSBI2_CMD);
155 ret = ssbi_wait_mask(ssbi, 0, SSBI_STATUS_MCHN_BUSY);
171 ssbi_pa_transfer(struct ssbi *ssbi, u32 cmd, u8 *data)
176 ssbi_writel(ssbi, cmd, SSBI_PA_CMD);
179 rd_status = ssbi_readl(ssbi, SSBI_PA_RD_STATUS);
196 ssbi_pa_read_bytes(struct ssbi *ssbi, u16 addr, u8 *buf, int len)
204 ret = ssbi_pa_transfer(ssbi, cmd, buf);
216 ssbi_pa_write_bytes(struct ssbi *ssbi, u16 addr, const u8 *buf, int len)
223 ret = ssbi_pa_transfer(ssbi, cmd, NULL);
236 struct ssbi *ssbi = dev_get_drvdata(dev);
240 spin_lock_irqsave(&ssbi->lock, flags);
241 ret = ssbi->read(ssbi, addr, buf, len);
242 spin_unlock_irqrestore(&ssbi->lock, flags);
250 struct ssbi *ssbi = dev_get_drvdata(dev);
254 spin_lock_irqsave(&ssbi->lock, flags);
255 ret = ssbi->write(ssbi, addr, buf, len);
256 spin_unlock_irqrestore(&ssbi->lock, flags);
265 struct ssbi *ssbi;
268 ssbi = devm_kzalloc(&pdev->dev, sizeof(*ssbi), GFP_KERNEL);
269 if (!ssbi)
272 ssbi->base = devm_platform_get_and_ioremap_resource(pdev, 0, NULL);
273 if (IS_ERR(ssbi->base))
274 return PTR_ERR(ssbi->base);
276 platform_set_drvdata(pdev, ssbi);
284 if (strcmp(type, "ssbi") == 0)
285 ssbi->controller_type = MSM_SBI_CTRL_SSBI;
287 ssbi->controller_type = MSM_SBI_CTRL_SSBI2;
289 ssbi->controller_type = MSM_SBI_CTRL_PMIC_ARBITER;
295 if (ssbi->controller_type == MSM_SBI_CTRL_PMIC_ARBITER) {
296 ssbi->read = ssbi_pa_read_bytes;
297 ssbi->write = ssbi_pa_write_bytes;
299 ssbi->read = ssbi_read_bytes;
300 ssbi->write = ssbi_write_bytes;
303 spin_lock_init(&ssbi->lock);
309 { .compatible = "qcom,ssbi" },
317 .name = "ssbi",
325 MODULE_ALIAS("platform:ssbi");