2010年10月4日星期一

TQ2440 sound card (uda1341)

Transplant the uda1341 driver to s3c2440 (tq2440 board).

First,let's analysis the source code of uda1341 driver.
sound/soc/s3c24xx/s3c24xx_uda134x.c
 242static struct s3c24xx_uda134x_platform_data *s3c24xx_uda134x_l3_pins;
 290static int s3c24xx_uda134x_probe(struct platform_device *pdev)
 291{
 292        int ret;
 293
 294        printk(KERN_INFO "S3C24XX_UDA134X SoC Audio driver\n");
 295
 296        s3c24xx_uda134x_l3_pins = pdev->dev.platform_data;
   /*here the probe() only take the platform_data from platform_device, and the corresponding type is s3c24xx_uda134x_paltform_data, and search the source we find that it is defined in include/sound/s3c24xx_uda134x.h */
 297        if (s3c24xx_uda134x_l3_pins == NULL) {
 298                printk(KERN_ERR "S3C24XX_UDA134X SoC Audio: "
 299                       "unable to find platform data\n");
 300                return -ENODEV;
 301        }
 302        s3c24xx_uda134x.power = s3c24xx_uda134x_l3_pins->power;
 303        s3c24xx_uda134x.model = s3c24xx_uda134x_l3_pins->model;
 304
 305        if (s3c24xx_uda134x_setup_pin(s3c24xx_uda134x_l3_pins->l3_data,
 306                                      "data") < 0)
 307                return -EBUSY;
 308        if (s3c24xx_uda134x_setup_pin(s3c24xx_uda134x_l3_pins->l3_clk,
 309                                      "clk") < 0) {
 310                gpio_free(s3c24xx_uda134x_l3_pins->l3_data);
 311                return -EBUSY;
 312        }
 313        if (s3c24xx_uda134x_setup_pin(s3c24xx_uda134x_l3_pins->l3_mode,
 314                                      "mode") < 0) {
 315                gpio_free(s3c24xx_uda134x_l3_pins->l3_data);
 316                gpio_free(s3c24xx_uda134x_l3_pins->l3_clk);
 317                return -EBUSY;
 318        }
 319
 320        s3c24xx_uda134x_snd_device = platform_device_alloc("soc-audio", -1);
 321        if (!s3c24xx_uda134x_snd_device) {
 322                printk(KERN_ERR "S3C24XX_UDA134X SoC Audio: "
 323                       "Unable to register\n");
 324                return -ENOMEM;
 325        }
 326
 327        platform_set_drvdata(s3c24xx_uda134x_snd_device,
 328                             &s3c24xx_uda134x_snd_devdata);
 329        s3c24xx_uda134x_snd_devdata.dev = &s3c24xx_uda134x_snd_device->dev;
 330        ret = platform_device_add(s3c24xx_uda134x_snd_device);
 331        if (ret) {
 332                printk(KERN_ERR "S3C24XX_UDA134X SoC Audio: Unable to add\n");
 333                platform_device_put(s3c24xx_uda134x_snd_device);
 334        }
 335
 336        return ret;
 337}


include/sound/s3c24xx_uda134x.h
   1#ifndef _S3C24XX_UDA134X_H_
   2#define _S3C24XX_UDA134X_H_ 1
   3
   4#include <sound/uda134x.h>
   5
   6struct s3c24xx_uda134x_platform_data {
   7        int l3_clk;
   8        int l3_mode;
   9        int l3_data;
   /*the three member above is a l3 interface, and we must register io port to them.*/
  10        void (*power) (int);
  11        int model;
   /*the model is used to identify different types of uda134x, and the Marco is defined in include/sound/uda134x.h */
  12};
  13
  14#endif

include/sound/uda134x.h
   1/*
   2 * uda134x.h  --  UDA134x ALSA SoC Codec driver
   3 *
   4 * Copyright 2007 Dension Audio Systems Ltd.
   5 * Author: Zoltan Devai
   6 *
   7 * This program is free software; you can redistribute it and/or modify
   8 * it under the terms of the GNU General Public License version 2 as
   9 * published by the Free Software Foundation.
  10 */
  11
  12#ifndef _UDA134X_H
  13#define _UDA134X_H
  14
  15#include <sound/l3.h>
  16
  17struct uda134x_platform_data {
  18        struct l3_pins l3;
  19        void (*power) (int);
  20        int model;
  21#define UDA134X_UDA1340 1
  22#define UDA134X_UDA1341 2
  23#define UDA134X_UDA1344 3
  24#define UDA134X_UDA1345 4
  25};
  26
  27#endif /* _UDA134X_H */
  28
Next, initialize the platform_device in mach-s3c2440/tq2440.c (your board specified file)

/*for sound car UDA 1341*/
#include <sound/s3c24xx_uda134x.h>

/*for sound card uda1341*/
static struct s3c24xx_uda134x_platform_data tq2440_uda1341_platform_data = {
.l3_clk = S3C2410_GPB(4),
.l3_mode = S3C2410_GPB(2),
.l3_data = S3C2410_GPB(3),
.model = UDA134X_UDA1341,
};
static struct platform_device tq2440_device_uda1341 = {
.name = "s3c24xx_uda1341",/*the name must be confronted to the driver*/
.id = 0,
.dev = {
.platform_data = &tq2440_uda1341_platform_data,
}
};

static struct platform_device *tq2440_devices[] __initdata = {
&s3c_device_usb,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c0,
&s3c_device_iis,
&tq2440_device_dm9000, //for DM9000//
&s3c_device_usbgadget, //for s3c USB device, the struct already included in plat/devs.h
&s3c_device_ac97, //for s3c AC97
&tq2440_device_uda1341 //for soundcard uda1341
};

And don't forget to enable the uda134x driver in the kernel configure.


After compiling the the kernel, if you built it as a module, and then just run “modprobe snd-soc-s3c24xx-uda134x”.By the way, if you need oss support, for example, mplayer was built without alsa support, you can load oss module with the command “modprobe snd-pcm-oss”.

没有评论:

发表评论