* Andrzej Zaborowski <[EMAIL PROTECTED]> [080329 18:30]:
> From: Andrzej Zaborowski <[EMAIL PROTECTED]>
>
> Prevent AIC23 driver Oopsing when no AIC23 is present by moving some of the
> initialisation to after the chip is found. There seems to be more that
> should be fixed in this driver but with this change it can at least be
> compiled into a kernel safely.
This does not seem to apply, can you please check?
Regards,
Tony
>
> Signed-off-by: Andrzej Zaborowski <[EMAIL PROTECTED]>
> ---
> drivers/i2c/chips/tlv320aic23.c | 92 ++++++++++++++++++++------------------
> 1 files changed, 48 insertions(+), 44 deletions(-)
>
> diff --git a/drivers/i2c/chips/tlv320aic23.c b/drivers/i2c/chips/tlv320aic23.c
> index c1e27f1..1c498f2 100644
> --- a/drivers/i2c/chips/tlv320aic23.c
> +++ b/drivers/i2c/chips/tlv320aic23.c
> @@ -54,6 +54,7 @@ I2C_CLIENT_INSMOD;
> static struct i2c_driver aic23_driver;
> static struct i2c_client *new_client;
> static int selftest;
> +static struct platform_device audio_i2c_device;
>
> static struct aic23_info {
> u16 volume_reg_left;
> @@ -95,6 +96,38 @@ int aic23_write_value(u8 reg, u16 value)
> return 0;
> }
>
> +/*
> + * Configures the McBSP3 which is used to send clock to the AIC23 codec.
> + * The input clock rate from DSP is 12MHz.
> + * The DSP clock must be on before this is called.
> + */
> +static int omap_mcbsp3_aic23_clock_init(void)
> +{
> + u16 w;
> +
> + /* enable 12MHz clock to mcbsp 1 & 3 */
> + __raw_writew(__raw_readw(DSP_IDLECT2) | (1<<1), DSP_IDLECT2);
> + __raw_writew(__raw_readw(DSP_RSTCT2) | 1 | 1<<1, DSP_RSTCT2);
> +
> + /* disable sample rate generator */
> + OMAP_MCBSP_WRITE(OMAP1610_MCBSP3_BASE, SPCR1, 0x0000);
> + OMAP_MCBSP_WRITE(OMAP1610_MCBSP3_BASE, SPCR2, 0x0000);
> +
> + /* pin control register */
> + OMAP_MCBSP_WRITE(OMAP1610_MCBSP3_BASE, PCR0,(CLKXM | CLKXP | CLKRP));
> +
> + /* configure srg to send 12MHz pulse from dsp peripheral clock */
> + OMAP_MCBSP_WRITE(OMAP1610_MCBSP3_BASE, SRGR1, 0x0000);
> + OMAP_MCBSP_WRITE(OMAP1610_MCBSP3_BASE, SRGR2, CLKSM);
> +
> + /* enable sample rate generator */
> + w = OMAP_MCBSP_READ(OMAP1610_MCBSP3_BASE, SPCR2);
> + OMAP_MCBSP_WRITE(OMAP1610_MCBSP3_BASE, SPCR2, (w | FREE | GRST));
> + printk("Clock enabled to MCBSP1 & 3 \n");
> +
> + return 0;
> +}
> +
> static int aic23_detect_client(struct i2c_adapter *adapter, int address,
> int kind)
> {
> @@ -128,6 +161,19 @@ static int aic23_detect_client(struct i2c_adapter
> *adapter, int address,
> kfree(new_client);
> return err;
> }
> +
> + if (platform_device_register(&audio_i2c_device)) {
> + printk(KERN_WARNING "Failed to register audio i2c device\n");
> + selftest = -ENODEV;
> + return selftest;
> + }
> + /* FIXME: Do in board-specific file */
> + omap_mcbsp3_aic23_clock_init();
> +
> + if (!aic23_info_l.power_down)
> + aic23_power_up();
> + aic23_info_l.initialized = 1;
> +
> return 0;
> }
>
> @@ -135,6 +181,8 @@ static int aic23_detach_client(struct i2c_client *client)
> {
> int err;
>
> + platform_device_unregister(&audio_i2c_device);
> +
> if ((err = i2c_detach_client(client))) {
> printk("aic23.o: Client deregistration failed, \
> client not detached.\n");
> @@ -162,38 +210,6 @@ static struct i2c_driver aic23_driver = {
> .detach_client = aic23_detach_client,
> };
>
> -/*
> - * Configures the McBSP3 which is used to send clock to the AIC23 codec.
> - * The input clock rate from DSP is 12MHz.
> - * The DSP clock must be on before this is called.
> - */
> -static int omap_mcbsp3_aic23_clock_init(void)
> -{
> - u16 w;
> -
> - /* enable 12MHz clock to mcbsp 1 & 3 */
> - __raw_writew(__raw_readw(DSP_IDLECT2) | (1<<1), DSP_IDLECT2);
> - __raw_writew(__raw_readw(DSP_RSTCT2) | 1 | 1<<1, DSP_RSTCT2);
> -
> - /* disable sample rate generator */
> - OMAP_MCBSP_WRITE(OMAP1610_MCBSP3_BASE, SPCR1, 0x0000);
> - OMAP_MCBSP_WRITE(OMAP1610_MCBSP3_BASE, SPCR2, 0x0000);
> -
> - /* pin control register */
> - OMAP_MCBSP_WRITE(OMAP1610_MCBSP3_BASE, PCR0,(CLKXM | CLKXP | CLKRP));
> -
> - /* configure srg to send 12MHz pulse from dsp peripheral clock */
> - OMAP_MCBSP_WRITE(OMAP1610_MCBSP3_BASE, SRGR1, 0x0000);
> - OMAP_MCBSP_WRITE(OMAP1610_MCBSP3_BASE, SRGR2, CLKSM);
> -
> - /* enable sample rate generator */
> - w = OMAP_MCBSP_READ(OMAP1610_MCBSP3_BASE, SPCR2);
> - OMAP_MCBSP_WRITE(OMAP1610_MCBSP3_BASE, SPCR2, (w | FREE | GRST));
> - printk("Clock enabled to MCBSP1 & 3 \n");
> -
> - return 0;
> -}
> -
> static void update_volume_left(int volume)
> {
> u16 val = 0;
> @@ -633,17 +649,6 @@ static int __init aic23_init(void)
> return selftest;
> }
>
> - if (platform_device_register(&audio_i2c_device)) {
> - printk(KERN_WARNING "Failed to register audio i2c device\n");
> - platform_driver_unregister(&audio_i2c_driver);
> - selftest = -ENODEV;
> - return selftest;
> - }
> - /* FIXME: Do in board-specific file */
> - omap_mcbsp3_aic23_clock_init();
> - if (!aic23_info_l.power_down)
> - aic23_power_up();
> - aic23_info_l.initialized = 1;
> printk("TLV320AIC23 I2C version %s (%s)\n",
> TLV320AIC23_VERSION, TLV320AIC23_DATE);
>
> @@ -658,7 +663,6 @@ static void __exit aic23_exit(void)
> if ((res = i2c_del_driver(&aic23_driver)))
> printk("aic23 i2c: Driver remove failed, module not
> removed.\n");
>
> - platform_device_unregister(&audio_i2c_device);
> platform_driver_unregister(&audio_i2c_driver);
> }
>
> --
> 1.5.3.4
>
> --
> To unsubscribe from this list: send the line "unsubscribe linux-omap" in
> the body of a message to [EMAIL PROTECTED]
> More majordomo info at http://vger.kernel.org/majordomo-info.html
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at http://vger.kernel.org/majordomo-info.html