[PATCH v2 3/4] ALSA: hda/cirrus: Add jack detect interrupt support from CS42L42 companion codec.

kernel test robot lkp at intel.com
Fri Mar 5 00:13:02 CET 2021


Hi Vitaly,

Thank you for the patch! Perhaps something to improve:

[auto build test WARNING on sound/for-next]
[also build test WARNING on v5.12-rc1 next-20210304]
[If your patch is applied to the wrong git tree, kindly drop us a note.
And when submitting patch, we suggest to use '--base' as documented in
https://git-scm.com/docs/git-format-patch]

url:    https://github.com/0day-ci/linux/commits/Vitaly-Rodionov/ALSA-hda-cirrus-Add-support-for-CS8409-HDA-bridge-and-CS42L42-companion-codec/20210305-030714
base:   https://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git for-next
config: riscv-randconfig-r025-20210304 (attached as .config)
compiler: clang version 13.0.0 (https://github.com/llvm/llvm-project eec7f8f7b1226be422a76542cb403d02538f453a)
reproduce (this is a W=1 build):
        wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
        chmod +x ~/bin/make.cross
        # install riscv cross compiling tool for clang build
        # apt-get install binutils-riscv64-linux-gnu
        # https://github.com/0day-ci/linux/commit/9d4c2aa0fd6872aa8b866929c1537ce2905a6dba
        git remote add linux-review https://github.com/0day-ci/linux
        git fetch --no-tags linux-review Vitaly-Rodionov/ALSA-hda-cirrus-Add-support-for-CS8409-HDA-bridge-and-CS42L42-companion-codec/20210305-030714
        git checkout 9d4c2aa0fd6872aa8b866929c1537ce2905a6dba
        # save the attached .config to linux build tree
        COMPILER_INSTALL_PATH=$HOME/0day COMPILER=clang make.cross ARCH=riscv 

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp at intel.com>

All warnings (new ones prefixed by >>):

   sound/pci/hda/patch_cirrus.c:1529:37: warning: variable 'retval' is uninitialized when used here [-Wuninitialized]
                                   __func__, i2c_address, i2c_reg, retval);
                                                                   ^~~~~~
   sound/pci/hda/hda_local.h:723:39: note: expanded from macro 'codec_err'
           dev_err(hda_codec_dev(codec), fmt, ##args)
                                                ^~~~
   include/linux/dev_printk.h:112:32: note: expanded from macro 'dev_err'
           _dev_err(dev, dev_fmt(fmt), ##__VA_ARGS__)
                                         ^~~~~~~~~~~
   sound/pci/hda/patch_cirrus.c:1519:21: note: initialize the variable 'retval' to silence this warning
           unsigned int retval;
                              ^
                               = 0
>> sound/pci/hda/patch_cirrus.c:1686:6: warning: no previous prototype for function 'cs8409_jack_unsol_event' [-Wmissing-prototypes]
   void cs8409_jack_unsol_event(struct hda_codec *codec, unsigned int res)
        ^
   sound/pci/hda/patch_cirrus.c:1686:1: note: declare 'static' if the function is not intended to be used outside of this translation unit
   void cs8409_jack_unsol_event(struct hda_codec *codec, unsigned int res)
   ^
   static 
   2 warnings generated.


vim +/cs8409_jack_unsol_event +1686 sound/pci/hda/patch_cirrus.c

  1511	
  1512	/* CS8409 slave i2cRead */
  1513	static unsigned int cs8409_i2c_read(struct hda_codec *codec,
  1514			unsigned int i2c_address,
  1515			unsigned int i2c_reg,
  1516			unsigned int paged)
  1517	{
  1518		unsigned int i2c_reg_data;
> 1519		unsigned int retval;
  1520	
  1521		cs8409_enable_i2c_clock(codec, 1);
  1522		cs_vendor_coef_set(codec, CIR_I2C_ADDR, i2c_address);
  1523	
  1524		if (paged) {
  1525			cs_vendor_coef_set(codec, CIR_I2C_QWRITE, i2c_reg >> 8);
  1526			if (cs8409_i2c_wait_complete(codec) == -1) {
  1527				codec_err(codec,
  1528					"%s() Paged Transaction Failed 0x%02x : 0x%04x = 0x%02x\n",
  1529					__func__, i2c_address, i2c_reg, retval);
  1530			}
  1531		}
  1532	
  1533		i2c_reg_data = (i2c_reg << 8) & 0x0ffff;
  1534		cs_vendor_coef_set(codec, CIR_I2C_QREAD, i2c_reg_data);
  1535		if (cs8409_i2c_wait_complete(codec) == -1) {
  1536			codec_err(codec, "%s() Transaction Failed 0x%02x : 0x%04x = 0x%02x\n",
  1537				__func__, i2c_address, i2c_reg, retval);
  1538		}
  1539	
  1540		/* Register in bits 15-8 and the data in 7-0 */
  1541		retval = cs_vendor_coef_get(codec, CIR_I2C_QREAD);
  1542		retval &= 0x0ff;
  1543	
  1544		cs8409_enable_i2c_clock(codec, 0);
  1545	
  1546		return retval;
  1547	}
  1548	
  1549	/* CS8409 slave i2cWrite */
  1550	static unsigned int cs8409_i2c_write(struct hda_codec *codec,
  1551			unsigned int i2c_address, unsigned int i2c_reg,
  1552			unsigned int i2c_data,
  1553			unsigned int paged)
  1554	{
  1555		unsigned int retval = 0;
  1556		unsigned int i2c_reg_data = 0;
  1557	
  1558		cs8409_enable_i2c_clock(codec, 1);
  1559		cs_vendor_coef_set(codec, CIR_I2C_ADDR, i2c_address);
  1560	
  1561		if (paged) {
  1562			cs_vendor_coef_set(codec, CIR_I2C_QWRITE, i2c_reg >> 8);
  1563			if (cs8409_i2c_wait_complete(codec) == -1) {
  1564				codec_err(codec,
  1565					"%s() Paged Transaction Failed 0x%02x : 0x%04x = 0x%02x\n",
  1566					__func__, i2c_address, i2c_reg, retval);
  1567			}
  1568		}
  1569	
  1570		i2c_reg_data = ((i2c_reg << 8) & 0x0ff00) | (i2c_data & 0x0ff);
  1571		cs_vendor_coef_set(codec, CIR_I2C_QWRITE, i2c_reg_data);
  1572	
  1573		if (cs8409_i2c_wait_complete(codec) == -1) {
  1574			codec_err(codec, "%s() Transaction Failed 0x%02x : 0x%04x = 0x%02x\n",
  1575				__func__, i2c_address, i2c_reg, retval);
  1576		}
  1577	
  1578		cs8409_enable_i2c_clock(codec, 0);
  1579	
  1580		return retval;
  1581	}
  1582	
  1583	/* Assert/release RTS# line to CS42L42 */
  1584	static void cs8409_cs42l42_reset(struct hda_codec *codec)
  1585	{
  1586		struct cs_spec *spec = codec->spec;
  1587	
  1588		/* Assert RTS# line */
  1589		snd_hda_codec_write(codec,
  1590				codec->core.afg, 0, AC_VERB_SET_GPIO_DATA, 0);
  1591		/* wait ~10ms */
  1592		usleep_range(10000, 15000);
  1593		/* Release RTS# line */
  1594		snd_hda_codec_write(codec,
  1595				codec->core.afg, 0, AC_VERB_SET_GPIO_DATA, GPIO5_INT);
  1596		/* wait ~10ms */
  1597		usleep_range(10000, 15000);
  1598	
  1599		mutex_lock(&spec->cs8409_i2c_mux);
  1600	
  1601		/* Clear interrupts, by reading interrupt status registers */
  1602		cs8409_i2c_read(codec, CS42L42_I2C_ADDR, 0x1308, 1);
  1603		cs8409_i2c_read(codec, CS42L42_I2C_ADDR, 0x1309, 1);
  1604		cs8409_i2c_read(codec, CS42L42_I2C_ADDR, 0x130A, 1);
  1605		cs8409_i2c_read(codec, CS42L42_I2C_ADDR, 0x130F, 1);
  1606	
  1607		mutex_unlock(&spec->cs8409_i2c_mux);
  1608	
  1609	}
  1610	
  1611	/* Configure CS42L42 slave codec for jack autodetect */
  1612	static int cs8409_cs42l42_enable_jack_detect(struct hda_codec *codec)
  1613	{
  1614		struct cs_spec *spec = codec->spec;
  1615	
  1616		mutex_lock(&spec->cs8409_i2c_mux);
  1617	
  1618		/* Set TIP_SENSE_EN for analog front-end of tip sense. */
  1619		cs8409_i2c_write(codec, CS42L42_I2C_ADDR, 0x1b70, 0x0020, 1);
  1620		/* Clear WAKE# */
  1621		cs8409_i2c_write(codec, CS42L42_I2C_ADDR, 0x1b71, 0x0001, 1);
  1622		/* Wait ~2.5ms */
  1623		usleep_range(2500, 3000);
  1624		/* Set mode WAKE# output follows the combination logic directly */
  1625		cs8409_i2c_write(codec, CS42L42_I2C_ADDR, 0x1b71, 0x0020, 1);
  1626		/* Clear interrupts status */
  1627		cs8409_i2c_read(codec, CS42L42_I2C_ADDR, 0x130f, 1);
  1628		cs8409_i2c_read(codec, CS42L42_I2C_ADDR, 0x1b7b, 1);
  1629		/* Enable interrupt */
  1630		cs8409_i2c_write(codec, CS42L42_I2C_ADDR, 0x1320, 0x03, 1);
  1631		cs8409_i2c_write(codec, CS42L42_I2C_ADDR, 0x1b79, 0x00, 1);
  1632	
  1633		mutex_unlock(&spec->cs8409_i2c_mux);
  1634	
  1635		return 0;
  1636	}
  1637	
  1638	/* Enable and run CS42L42 slave codec jack auto detect */
  1639	static void cs8409_cs42l42_run_jack_detect(struct hda_codec *codec)
  1640	{
  1641		struct cs_spec *spec = codec->spec;
  1642	
  1643		mutex_lock(&spec->cs8409_i2c_mux);
  1644	
  1645		/* Clear interrupts */
  1646		cs8409_i2c_read(codec, CS42L42_I2C_ADDR, 0x1308, 1);
  1647		cs8409_i2c_read(codec, CS42L42_I2C_ADDR, 0x1b77, 1);
  1648	
  1649		cs8409_i2c_write(codec, CS42L42_I2C_ADDR, 0x1102, 0x87, 1);
  1650		cs8409_i2c_write(codec, CS42L42_I2C_ADDR, 0x1f06, 0x86, 1);
  1651		cs8409_i2c_write(codec, CS42L42_I2C_ADDR, 0x1b74, 0x07, 1);
  1652		cs8409_i2c_write(codec, CS42L42_I2C_ADDR, 0x131b, 0x01, 1);
  1653		cs8409_i2c_write(codec, CS42L42_I2C_ADDR, 0x1120, 0x80, 1);
  1654		/* Wait ~110ms*/
  1655		usleep_range(110000, 200000);
  1656		cs8409_i2c_write(codec, CS42L42_I2C_ADDR, 0x111f, 0x77, 1);
  1657		cs8409_i2c_write(codec, CS42L42_I2C_ADDR, 0x1120, 0xc0, 1);
  1658		/* Wait ~10ms */
  1659		usleep_range(10000, 25000);
  1660	
  1661		mutex_unlock(&spec->cs8409_i2c_mux);
  1662	
  1663	}
  1664	
  1665	static void cs8409_cs42l42_reg_setup(struct hda_codec *codec)
  1666	{
  1667		const struct cs8409_i2c_param *seq = cs42l42_init_reg_seq;
  1668		struct cs_spec *spec = codec->spec;
  1669	
  1670		mutex_lock(&spec->cs8409_i2c_mux);
  1671	
  1672		for (; seq->addr; seq++)
  1673			cs8409_i2c_write(codec, CS42L42_I2C_ADDR, seq->addr, seq->reg, 1);
  1674	
  1675		mutex_unlock(&spec->cs8409_i2c_mux);
  1676	
  1677	}
  1678	
  1679	/*
  1680	 * In the case of CS8409 we do not have unsolicited events from NID's 0x24
  1681	 * and 0x34 where hs mic and hp are connected. Companion codec CS42L42 will
  1682	 * generate interrupt via gpio 4 to notify jack events. We have to overwrite
  1683	 * generic snd_hda_jack_unsol_event(), read CS42L42 jack detect status registers
  1684	 * and then notify status via generic snd_hda_jack_unsol_event() call.
  1685	 */
> 1686	void cs8409_jack_unsol_event(struct hda_codec *codec, unsigned int res)
  1687	{
  1688		struct cs_spec *spec = codec->spec;
  1689		int status_changed = 0;
  1690		unsigned int reg_cdc_status = 0;
  1691		unsigned int reg_hs_status = 0;
  1692		unsigned int reg_ts_status = 0;
  1693		int type = 0;
  1694		struct hda_jack_tbl *jk;
  1695	
  1696		/* jack_unsol_event() will be called every time gpio line changing state.
  1697		 * In this case gpio4 line goes up as a result of reading interrupt status
  1698		 * registers in previous cs8409_jack_unsol_event() call.
  1699		 * We don't need to handle this event, ignoring...
  1700		 */
  1701		if ((res & (1 << 4)))
  1702			return;
  1703	
  1704		mutex_lock(&spec->cs8409_i2c_mux);
  1705	
  1706		/* Read jack detect status registers */
  1707		reg_cdc_status = cs8409_i2c_read(codec, CS42L42_I2C_ADDR, 0x1308, 1);
  1708		reg_hs_status = cs8409_i2c_read(codec, CS42L42_I2C_ADDR, 0x1124, 1);
  1709		reg_ts_status = cs8409_i2c_read(codec, CS42L42_I2C_ADDR, 0x130f, 1);
  1710	
  1711		/* Clear interrupts */
  1712		cs8409_i2c_read(codec, CS42L42_I2C_ADDR, 0x1b7b, 1);
  1713		cs8409_i2c_read(codec, CS42L42_I2C_ADDR, 0x1308, 1);
  1714		cs8409_i2c_read(codec, CS42L42_I2C_ADDR, 0x130f, 1);
  1715	
  1716		mutex_unlock(&spec->cs8409_i2c_mux);
  1717	
  1718		/* HSDET_AUTO_DONE */
  1719		if (reg_cdc_status & CS42L42_HSDET_AUTO_DONE) {
  1720	
  1721			type = ((reg_hs_status & CS42L42_HSTYPE_MASK) + 1);
  1722			/* CS42L42 reports optical jack as type 4
  1723			 * We don't handle optical jack
  1724			 */
  1725			if (type != 4) {
  1726				if (!spec->cs42l42_hp_jack_in) {
  1727					status_changed = 1;
  1728					spec->cs42l42_hp_jack_in = 1;
  1729				}
  1730				/* type = 3 has no mic */
  1731				if ((!spec->cs42l42_mic_jack_in) && (type != 3)) {
  1732					status_changed = 1;
  1733					spec->cs42l42_mic_jack_in = 1;
  1734				}
  1735			}
  1736	
  1737		} else {
  1738			/* TIP_SENSE INSERT/REMOVE */
  1739			switch (reg_ts_status) {
  1740			case CS42L42_JACK_INSERTED:
  1741				cs8409_cs42l42_run_jack_detect(codec);
  1742				break;
  1743	
  1744			case CS42L42_JACK_REMOVED:
  1745				if (spec->cs42l42_hp_jack_in || spec->cs42l42_mic_jack_in) {
  1746					status_changed = 1;
  1747					spec->cs42l42_hp_jack_in = 0;
  1748					spec->cs42l42_mic_jack_in = 0;
  1749				}
  1750				break;
  1751	
  1752			default:
  1753				/* jack in transition */
  1754				status_changed = 0;
  1755				break;
  1756			}
  1757		}
  1758	
  1759		if (status_changed) {
  1760	
  1761			snd_hda_set_pin_ctl(codec, CS8409_CS42L42_SPK_PIN_NID,
  1762					(spec->cs42l42_hp_jack_in)?0 : PIN_OUT);
  1763	
  1764			/* Report jack*/
  1765			jk = snd_hda_jack_tbl_get_mst(codec, CS8409_CS42L42_HP_PIN_NID, 0);
  1766			if (jk) {
  1767				snd_hda_jack_unsol_event(codec,
  1768					(jk->tag << AC_UNSOL_RES_TAG_SHIFT) & AC_UNSOL_RES_TAG);
  1769			}
  1770			/* Report jack*/
  1771			jk = snd_hda_jack_tbl_get_mst(codec, CS8409_CS42L42_AMIC_PIN_NID, 0);
  1772			if (jk) {
  1773				snd_hda_jack_unsol_event(codec,
  1774					(jk->tag << AC_UNSOL_RES_TAG_SHIFT) & AC_UNSOL_RES_TAG);
  1775			}
  1776		}
  1777	}
  1778	

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@lists.01.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: .config.gz
Type: application/gzip
Size: 26193 bytes
Desc: not available
URL: <http://mailman.alsa-project.org/pipermail/alsa-devel/attachments/20210305/146ac921/attachment-0001.gz>


More information about the Alsa-devel mailing list