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 <[email protected]>

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/[email protected]

Attachment: .config.gz
Description: application/gzip

Reply via email to