mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-05 10:31:46 +09:00
Revert "i3c: master: svc: use slow speed for first broadcast address"
This reverts commit 9530ad77c2 which is
commit 20ade67bb1645f5ce8f37fa79ddfebbc5b5b24ef upstream.
It breaks the Android kernel abi and can be brought back in the future
in an abi-safe way if it is really needed.
Bug: 161946584
Change-Id: I90ef4cfc92da57f38f44f60ba53bc0e948e98e31
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
@@ -175,7 +175,6 @@ struct svc_i3c_xfer {
|
||||
* @ibi.lock: IBI lock
|
||||
* @lock: Transfer lock, protect between IBI work thread and callbacks from master
|
||||
* @enabled_events: Bit masks for enable events (IBI, HotJoin).
|
||||
* @mctrl_config: Configuration value in SVC_I3C_MCTRL for setting speed back.
|
||||
*/
|
||||
struct svc_i3c_master {
|
||||
struct i3c_master_controller base;
|
||||
@@ -205,7 +204,6 @@ struct svc_i3c_master {
|
||||
} ibi;
|
||||
struct mutex lock;
|
||||
int enabled_events;
|
||||
u32 mctrl_config;
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -523,54 +521,6 @@ static irqreturn_t svc_i3c_master_irq_handler(int irq, void *dev_id)
|
||||
return IRQ_HANDLED;
|
||||
}
|
||||
|
||||
static int svc_i3c_master_set_speed(struct i3c_master_controller *m,
|
||||
enum i3c_open_drain_speed speed)
|
||||
{
|
||||
struct svc_i3c_master *master = to_svc_i3c_master(m);
|
||||
struct i3c_bus *bus = i3c_master_get_bus(&master->base);
|
||||
u32 ppbaud, odbaud, odhpp, mconfig;
|
||||
unsigned long fclk_rate;
|
||||
int ret;
|
||||
|
||||
ret = pm_runtime_resume_and_get(master->dev);
|
||||
if (ret < 0) {
|
||||
dev_err(master->dev, "<%s> Cannot get runtime PM.\n", __func__);
|
||||
return ret;
|
||||
}
|
||||
|
||||
switch (speed) {
|
||||
case I3C_OPEN_DRAIN_SLOW_SPEED:
|
||||
fclk_rate = clk_get_rate(master->fclk);
|
||||
if (!fclk_rate) {
|
||||
ret = -EINVAL;
|
||||
goto rpm_out;
|
||||
}
|
||||
/*
|
||||
* Set 50% duty-cycle I2C speed to I3C OPEN-DRAIN mode, so the first
|
||||
* broadcast address is visible to all I2C/I3C devices on the I3C bus.
|
||||
* I3C device working as a I2C device will turn off its 50ns Spike
|
||||
* Filter to change to I3C mode.
|
||||
*/
|
||||
mconfig = master->mctrl_config;
|
||||
ppbaud = FIELD_GET(GENMASK(11, 8), mconfig);
|
||||
odhpp = 0;
|
||||
odbaud = DIV_ROUND_UP(fclk_rate, bus->scl_rate.i2c * (2 + 2 * ppbaud)) - 1;
|
||||
mconfig &= ~GENMASK(24, 16);
|
||||
mconfig |= SVC_I3C_MCONFIG_ODBAUD(odbaud) | SVC_I3C_MCONFIG_ODHPP(odhpp);
|
||||
writel(mconfig, master->regs + SVC_I3C_MCONFIG);
|
||||
break;
|
||||
case I3C_OPEN_DRAIN_NORMAL_SPEED:
|
||||
writel(master->mctrl_config, master->regs + SVC_I3C_MCONFIG);
|
||||
break;
|
||||
}
|
||||
|
||||
rpm_out:
|
||||
pm_runtime_mark_last_busy(master->dev);
|
||||
pm_runtime_put_autosuspend(master->dev);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int svc_i3c_master_bus_init(struct i3c_master_controller *m)
|
||||
{
|
||||
struct svc_i3c_master *master = to_svc_i3c_master(m);
|
||||
@@ -653,7 +603,6 @@ static int svc_i3c_master_bus_init(struct i3c_master_controller *m)
|
||||
SVC_I3C_MCONFIG_I2CBAUD(i2cbaud);
|
||||
writel(reg, master->regs + SVC_I3C_MCONFIG);
|
||||
|
||||
master->mctrl_config = reg;
|
||||
/* Master core's registration */
|
||||
ret = i3c_master_get_free_addr(m, 0);
|
||||
if (ret < 0)
|
||||
@@ -1626,7 +1575,6 @@ static const struct i3c_master_controller_ops svc_i3c_master_ops = {
|
||||
.disable_ibi = svc_i3c_master_disable_ibi,
|
||||
.enable_hotjoin = svc_i3c_master_enable_hotjoin,
|
||||
.disable_hotjoin = svc_i3c_master_disable_hotjoin,
|
||||
.set_speed = svc_i3c_master_set_speed,
|
||||
};
|
||||
|
||||
static int svc_i3c_master_prepare_clks(struct svc_i3c_master *master)
|
||||
|
||||
Reference in New Issue
Block a user