Hello! I was compiling Linux 2.6.x for PowerPC and got compile errors:
sound/built-in.o(.text+0x28828): In function `daca_init_client': : undefined reference to `i2c_smbus_write_byte_data' sound/built-in.o(.text+0x28840): In function `daca_init_client': : undefined reference to `i2c_smbus_write_byte_data' sound/built-in.o(.text+0x2885c): In function `daca_init_client': : undefined reference to `i2c_smbus_write_block_data' and so on. It turns out CONFIG_SND_POWERMAC should not be enabled without CONFIG_I2C. My first idea was to add a dependency. However, the kernel finds Burgundy sound chip on my PowerPC. The code for Burgundy doesn't use I2C. I have to enable CONFIG_I2C (without any drivers) just to satisfy the linker. I think ideally the driver should be split into the base powermac driver and 3 specific drivers - AWACS, Burgundy and Keywest, the later being dependent on I2C. The attached patch implements an interim solution - there is still one module, but the user can select what hardware the module supports. Only Keywest devices require I2C. The patch is against Linux 2.6.4. -- Regards, Pavel Roskin
--- linux.orig/sound/ppc/Kconfig +++ linux/sound/ppc/Kconfig @@ -4,8 +4,30 @@ depends on SND!=n && PPC config SND_POWERMAC - tristate "PowerMac (AWACS, DACA, Burgundy, Tumbler, Keywest)" + tristate "PowerMac sound support" depends on SND + ---help--- + Answer Y or M to include support for intergrated sound devices on + PowerMac. You also need to select one of the drivers below. + +config SND_AWACS + bool "AWACS, Screamer sound support" + depends on SND_POWERMAC + ---help--- + Answer Y to include support for AWACS and Screamer sound on PowerMac. + +config SND_BURGUNDY + bool "Burgundy sound support" + depends on SND_POWERMAC + ---help--- + Answer Y to include support for Burgundy sound on PowerMac. + +config SND_KEYWEST + bool "Keywest (DACA, Tumbler, Snapper) sound support" + depends on SND_POWERMAC && I2C + ---help--- + Answer Y to include support for PowerMac Keywest sound devices, such + as DACA, Tumbler and Snapper. endmenu --- linux.orig/sound/ppc/Makefile +++ linux/sound/ppc/Makefile @@ -3,7 +3,16 @@ # Copyright (c) 2001 by Jaroslav Kysela <[EMAIL PROTECTED]> # -snd-powermac-objs := powermac.o pmac.o awacs.o burgundy.o daca.o tumbler.o keywest.o +snd-powermac-objs := powermac.o pmac.o +ifeq ($(CONFIG_SND_AWACS),y) +snd-powermac-objs += awacs.o +endif +ifeq ($(CONFIG_SND_BURGUNDY),y) +snd-powermac-objs += burgundy.o +endif +ifeq ($(CONFIG_SND_KEYWEST),y) +snd-powermac-objs += daca.o tumbler.o keywest.o +endif # Toplevel Module Dependency obj-$(CONFIG_SND_POWERMAC) += snd-powermac.o --- linux.orig/sound/ppc/powermac.c +++ linux/sound/ppc/powermac.c @@ -70,7 +70,6 @@ static int __init snd_pmac_probe(void) { snd_card_t *card; pmac_t *chip; - char *name_ext; int err; card = snd_card_new(index, id, THIS_MODULE, 0); @@ -81,6 +80,7 @@ static int __init snd_pmac_probe(void) goto __error; switch (chip->model) { +#ifdef CONFIG_SND_BURGUNDY case PMAC_BURGUNDY: strcpy(card->driver, "PMac Burgundy"); strcpy(card->shortname, "PowerMac Burgundy"); @@ -89,6 +89,8 @@ static int __init snd_pmac_probe(void) if ((err = snd_pmac_burgundy_init(chip)) < 0) goto __error; break; +#endif +#ifdef CONFIG_SND_KEYWEST case PMAC_DACA: strcpy(card->driver, "PMac DACA"); strcpy(card->shortname, "PowerMac DACA"); @@ -98,8 +100,8 @@ static int __init snd_pmac_probe(void) goto __error; break; case PMAC_TUMBLER: - case PMAC_SNAPPER: - name_ext = chip->model == PMAC_TUMBLER ? "Tumbler" : "Snapper"; + case PMAC_SNAPPER: { + char *name_ext = (chip->model == PMAC_TUMBLER) ? "Tumbler" : "Snapper"; sprintf(card->driver, "PMac %s", name_ext); sprintf(card->shortname, "PowerMac %s", name_ext); sprintf(card->longname, "%s (Dev %d) Sub-frame %d", @@ -107,9 +109,12 @@ static int __init snd_pmac_probe(void) if ((err = snd_pmac_tumbler_init(chip)) < 0) goto __error; break; + } +#endif +#ifdef CONFIG_SND_AWACS case PMAC_AWACS: - case PMAC_SCREAMER: - name_ext = chip->model == PMAC_SCREAMER ? "Screamer" : "AWACS"; + case PMAC_SCREAMER: { + char *name_ext = (chip->model == PMAC_SCREAMER) ? "Screamer" : "AWACS"; sprintf(card->driver, "PMac %s", name_ext); sprintf(card->shortname, "PowerMac %s", name_ext); if (chip->is_pbook_3400) @@ -123,6 +128,8 @@ static int __init snd_pmac_probe(void) if ((err = snd_pmac_awacs_init(chip)) < 0) goto __error; break; + } +#endif default: snd_printk("unsupported hardware %d\n", chip->model); err = -EINVAL;