static int ucb1x00_probe(struct mcp *mcp)
{
- struct ucb1x00 *ucb;
+ struct ucb1x00_plat_data *pdata = mcp->attached_device.platform_data;
struct ucb1x00_driver *drv;
- struct ucb1x00_plat_data *pdata;
+ struct ucb1x00 *ucb;
unsigned int id;
int ret = -ENODEV;
int temp;
+ /* Tell the platform to deassert the UCB1x00 reset */
+ if (pdata && pdata->reset)
+ pdata->reset(UCB_RST_PROBE);
+
mcp_enable(mcp);
id = mcp_reg_read(mcp, UCB_ID);
if (!ucb)
goto err_disable;
- pdata = mcp->attached_device.platform_data;
ucb->dev.class = &ucb1x00_class;
ucb->dev.parent = &mcp->attached_device;
dev_set_name(&ucb->dev, "ucb1x00");
}
mutex_unlock(&ucb1x00_mutex);
- goto out;
+ return ret;
err_irq:
free_irq(ucb->irq, ucb);
err_disable:
mcp_disable(mcp);
out:
+ if (pdata && pdata->reset)
+ pdata->reset(UCB_RST_PROBE_FAIL);
return ret;
}
static void ucb1x00_remove(struct mcp *mcp)
{
+ struct ucb1x00_plat_data *pdata = mcp->attached_device.platform_data;
struct ucb1x00 *ucb = mcp_get_drvdata(mcp);
struct list_head *l, *n;
int ret;
free_irq(ucb->irq, ucb);
device_unregister(&ucb->dev);
+
+ if (pdata && pdata->reset)
+ pdata->reset(UCB_RST_REMOVE);
}
int ucb1x00_register_driver(struct ucb1x00_driver *drv)
#define UCB_MODE_DYN_VFLAG_ENA (1 << 12)
#define UCB_MODE_AUD_OFF_CAN (1 << 13)
+enum ucb1x00_reset {
+ UCB_RST_PROBE,
+ UCB_RST_REMOVE,
+ UCB_RST_PROBE_FAIL,
+};
+
struct ucb1x00_plat_data {
+ void (*reset)(enum ucb1x00_reset);
int gpio_base;
};