Commit 82f5c70c authored by Jonathan Marek's avatar Jonathan Marek Committed by Vinod Koul

soundwire: qcom: add support for mmio soundwire master devices

Adds support for qcom soundwire devices with memory mapped IO registers.
Signed-off-by: default avatarJonathan Marek <jonathan@marek.ca>
Tested-by: default avatarSrinivas Kandagatla <srinivas.kandagatla@linaro.org>
Reviewed-by: default avatarSrinivas Kandagatla <srinivas.kandagatla@linaro.org>
Link: https://lore.kernel.org/r/20200905173905.16541-4-jonathan@marek.caSigned-off-by: default avatarVinod Koul <vkoul@kernel.org>
parent 5bd77324
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
#define SWRM_INTERRUPT_STATUS_SPECIAL_CMD_ID_FINISHED BIT(10) #define SWRM_INTERRUPT_STATUS_SPECIAL_CMD_ID_FINISHED BIT(10)
#define SWRM_INTERRUPT_MASK_ADDR 0x204 #define SWRM_INTERRUPT_MASK_ADDR 0x204
#define SWRM_INTERRUPT_CLEAR 0x208 #define SWRM_INTERRUPT_CLEAR 0x208
#define SWRM_INTERRUPT_CPU_EN 0x210
#define SWRM_CMD_FIFO_WR_CMD 0x300 #define SWRM_CMD_FIFO_WR_CMD 0x300
#define SWRM_CMD_FIFO_RD_CMD 0x304 #define SWRM_CMD_FIFO_RD_CMD 0x304
#define SWRM_CMD_FIFO_CMD 0x308 #define SWRM_CMD_FIFO_CMD 0x308
...@@ -87,6 +88,7 @@ struct qcom_swrm_ctrl { ...@@ -87,6 +88,7 @@ struct qcom_swrm_ctrl {
struct sdw_bus bus; struct sdw_bus bus;
struct device *dev; struct device *dev;
struct regmap *regmap; struct regmap *regmap;
void __iomem *mmio;
struct completion *comp; struct completion *comp;
struct work_struct slave_work; struct work_struct slave_work;
/* read/write lock */ /* read/write lock */
...@@ -151,6 +153,20 @@ static int qcom_swrm_ahb_reg_write(struct qcom_swrm_ctrl *ctrl, ...@@ -151,6 +153,20 @@ static int qcom_swrm_ahb_reg_write(struct qcom_swrm_ctrl *ctrl,
return SDW_CMD_OK; return SDW_CMD_OK;
} }
static int qcom_swrm_cpu_reg_read(struct qcom_swrm_ctrl *ctrl, int reg,
u32 *val)
{
*val = readl(ctrl->mmio + reg);
return SDW_CMD_OK;
}
static int qcom_swrm_cpu_reg_write(struct qcom_swrm_ctrl *ctrl, int reg,
int val)
{
writel(val, ctrl->mmio + reg);
return SDW_CMD_OK;
}
static int qcom_swrm_cmd_fifo_wr_cmd(struct qcom_swrm_ctrl *ctrl, u8 cmd_data, static int qcom_swrm_cmd_fifo_wr_cmd(struct qcom_swrm_ctrl *ctrl, u8 cmd_data,
u8 dev_addr, u16 reg_addr) u8 dev_addr, u16 reg_addr)
{ {
...@@ -305,6 +321,12 @@ static int qcom_swrm_init(struct qcom_swrm_ctrl *ctrl) ...@@ -305,6 +321,12 @@ static int qcom_swrm_init(struct qcom_swrm_ctrl *ctrl)
ctrl->reg_write(ctrl, SWRM_COMP_CFG_ADDR, ctrl->reg_write(ctrl, SWRM_COMP_CFG_ADDR,
SWRM_COMP_CFG_IRQ_LEVEL_OR_PULSE_MSK | SWRM_COMP_CFG_IRQ_LEVEL_OR_PULSE_MSK |
SWRM_COMP_CFG_ENABLE_MSK); SWRM_COMP_CFG_ENABLE_MSK);
/* enable CPU IRQs */
if (ctrl->mmio) {
ctrl->reg_write(ctrl, SWRM_INTERRUPT_CPU_EN,
SWRM_INTERRUPT_STATUS_RMSK);
}
return 0; return 0;
} }
...@@ -756,8 +778,11 @@ static int qcom_swrm_probe(struct platform_device *pdev) ...@@ -756,8 +778,11 @@ static int qcom_swrm_probe(struct platform_device *pdev)
if (!ctrl->regmap) if (!ctrl->regmap)
return -EINVAL; return -EINVAL;
} else { } else {
/* Only WCD based SoundWire controller is supported */ ctrl->reg_read = qcom_swrm_cpu_reg_read;
return -ENOTSUPP; ctrl->reg_write = qcom_swrm_cpu_reg_write;
ctrl->mmio = devm_platform_ioremap_resource(pdev, 0);
if (IS_ERR(ctrl->mmio))
return PTR_ERR(ctrl->mmio);
} }
ctrl->irq = of_irq_get(dev->of_node, 0); ctrl->irq = of_irq_get(dev->of_node, 0);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment