Message ID | 20200311184128.4212-4-pierre-louis.bossart@linux.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | SoundWire: cadence: add clock stop and fix programming sequences | expand |
On 11-03-20, 13:41, Pierre-Louis Bossart wrote: > From: Rander Wang <rander.wang@intel.com> > > If master is in clock stop state, driver can't modify registers > in master except the registers for clock stop setting. > > Signed-off-by: Rander Wang <rander.wang@intel.com> > Signed-off-by: Pierre-Louis Bossart <pierre-louis.bossart@linux.intel.com> > --- > drivers/soundwire/cadence_master.c | 19 +++++++++++++++++++ > drivers/soundwire/cadence_master.h | 2 ++ > 2 files changed, 21 insertions(+) > > diff --git a/drivers/soundwire/cadence_master.c b/drivers/soundwire/cadence_master.c > index 941809ea00a8..71cba2585151 100644 > --- a/drivers/soundwire/cadence_master.c > +++ b/drivers/soundwire/cadence_master.c > @@ -1207,6 +1207,25 @@ static const struct sdw_master_port_ops cdns_port_ops = { > .dpn_port_enable_ch = cdns_port_enable, > }; > > +/** > + * sdw_cdns_is_clock_stop: Check clock status > + * > + * @cdns: Cadence instance > + */ > +bool sdw_cdns_is_clock_stop(struct sdw_cdns *cdns) > +{ > + u32 status; > + > + status = cdns_readl(cdns, CDNS_MCP_STAT) & CDNS_MCP_STAT_CLK_STOP; > + if (status) { > + dev_dbg(cdns->dev, "Clock is stopped\n"); > + return true; > + } This can be further optimized to: return !!(cdns_readl(cdns, CDNS_MCP_STAT) & CDNS_MCP_STAT_CLK_STOP);
>> +/** >> + * sdw_cdns_is_clock_stop: Check clock status >> + * >> + * @cdns: Cadence instance >> + */ >> +bool sdw_cdns_is_clock_stop(struct sdw_cdns *cdns) >> +{ >> + u32 status; >> + >> + status = cdns_readl(cdns, CDNS_MCP_STAT) & CDNS_MCP_STAT_CLK_STOP; >> + if (status) { >> + dev_dbg(cdns->dev, "Clock is stopped\n"); >> + return true; >> + } > > This can be further optimized to: > > return !!(cdns_readl(cdns, CDNS_MCP_STAT) & CDNS_MCP_STAT_CLK_STOP); The logs are very useful for debug.
On 13-03-20, 11:31, Pierre-Louis Bossart wrote: > > > > > +/** > > > + * sdw_cdns_is_clock_stop: Check clock status > > > + * > > > + * @cdns: Cadence instance > > > + */ > > > +bool sdw_cdns_is_clock_stop(struct sdw_cdns *cdns) > > > +{ > > > + u32 status; > > > + > > > + status = cdns_readl(cdns, CDNS_MCP_STAT) & CDNS_MCP_STAT_CLK_STOP; > > > + if (status) { > > > + dev_dbg(cdns->dev, "Clock is stopped\n"); > > > + return true; > > > + } > > > > This can be further optimized to: > > > > return !!(cdns_readl(cdns, CDNS_MCP_STAT) & CDNS_MCP_STAT_CLK_STOP); > > The logs are very useful for debug. You have this log also in caller function.
diff --git a/drivers/soundwire/cadence_master.c b/drivers/soundwire/cadence_master.c index 941809ea00a8..71cba2585151 100644 --- a/drivers/soundwire/cadence_master.c +++ b/drivers/soundwire/cadence_master.c @@ -1207,6 +1207,25 @@ static const struct sdw_master_port_ops cdns_port_ops = { .dpn_port_enable_ch = cdns_port_enable, }; +/** + * sdw_cdns_is_clock_stop: Check clock status + * + * @cdns: Cadence instance + */ +bool sdw_cdns_is_clock_stop(struct sdw_cdns *cdns) +{ + u32 status; + + status = cdns_readl(cdns, CDNS_MCP_STAT) & CDNS_MCP_STAT_CLK_STOP; + if (status) { + dev_dbg(cdns->dev, "Clock is stopped\n"); + return true; + } + + return false; +} +EXPORT_SYMBOL(sdw_cdns_is_clock_stop); + /** * sdw_cdns_probe() - Cadence probe routine * @cdns: Cadence instance diff --git a/drivers/soundwire/cadence_master.h b/drivers/soundwire/cadence_master.h index 44e802bba702..691faa386889 100644 --- a/drivers/soundwire/cadence_master.h +++ b/drivers/soundwire/cadence_master.h @@ -144,6 +144,8 @@ int sdw_cdns_pdi_init(struct sdw_cdns *cdns, int sdw_cdns_exit_reset(struct sdw_cdns *cdns); int sdw_cdns_enable_interrupt(struct sdw_cdns *cdns, bool state); +bool sdw_cdns_is_clock_stop(struct sdw_cdns *cdns); + #ifdef CONFIG_DEBUG_FS void sdw_cdns_debugfs_init(struct sdw_cdns *cdns, struct dentry *root); #endif