New style driver for w83781d?

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Wolfgang,

On Wed, 13 Aug 2008 12:14:29 +0200, Wolfgang Grandegger wrote:
> Jean Delvare wrote:
> > On Tue, 12 Aug 2008 11:28:54 +0200, Wolfgang Grandegger wrote:
> >> Jean Delvare wrote:
> >>> Hi Wolfgang,
> >>>
> >>> On Tue, 12 Aug 2008 10:55:58 +0200, Wolfgang Grandegger wrote:
> >>>> We need support for the MON35W42 on an embedded MPC8544 board, which 
> >>>> seems to be compatible with the w83782d. There are more issues, e.g. the 
> >>>> early ISA bus probing of the existing driver hangs the system. Maybe i2c 
> >>>> probing should be done first!?
> >>> If both interfaces are available, we want to use the ISA one, because
> >>> it's much faster, so it must be registered first.
> >>>
> >>> What could be done though would be disabling the ISA interface
> >>> altogether on architectures where it isn't supported (in particular
> >>> PPC.) This shouldn't be too difficult. If you write a patch doing this,
> >>> I'll be happy to review it. Affected drivers would be w83781d and lm78.
> >> Some PPC have an ISA bus as well:
> >>
> >>    http://lxr.linux.no/linux+v2.6.26.2/arch/powerpc/Kconfig#L494
> >>
> >> I think selecting the ISA code with '#ifdef CONFIG_ISA' would be the 
> >> right solution?
> > 
> > Agreed.
> 
> See the attached patch below. When I have some more free time, I will
> convert the driver to new style as well.

Weren't you supposed to work on top of my 2 patches? Please do,
especially when my patches have an impact on the relation between the
ISA device and potential I2C devices.

Your patch breaks the build with CONFIG_ISA=y:

  CC [M]  drivers/hwmon/w83781d.o
drivers/hwmon/w83781d.c: In function `w83781d_read_value_i2c_isa':
drivers/hwmon/w83781d.c:1668: error: `client' undeclared (first use in this function)
drivers/hwmon/w83781d.c:1668: error: (Each undeclared identifier is reported only once
drivers/hwmon/w83781d.c:1668: error: for each function it appears in.)
drivers/hwmon/w83781d.c:1660: warning: unused variable `bank'
drivers/hwmon/w83781d.c: In function `w83781d_write_value_i2c_isa':
drivers/hwmon/w83781d.c:1694: warning: unused variable `bank'
drivers/hwmon/w83781d.c:1695: warning: unused variable `cl'
drivers/hwmon/w83781d.c: In function `w83781d_isa_add_driver':
drivers/hwmon/w83781d.c:1967: error: `w83781d_read_value_isa' undeclared (first use in this function)
drivers/hwmon/w83781d.c:1968: error: `w83781d_write_value_isa' undeclared (first use in this function)
drivers/hwmon/w83781d.c: At top level:
drivers/hwmon/w83781d.c:1659: warning: 'w83781d_read_value_i2c_isa' defined but not used
drivers/hwmon/w83781d.c:1692: warning: 'w83781d_write_value_i2c_isa' defined but not used
make[2]: *** [drivers/hwmon/w83781d.o] Error 1
make[1]: *** [drivers/hwmon] Error 2
make: *** [drivers] Error 2

Apparently you didn't test that case - you really have to.

I am surprised by the size of your patch. I expected something much
smaller and less intrusive than that. As I understand it, you tried to
optimize the case CONFIG_ISA=n. Did you check how much exactly this was
saving? I guess not much.

I don't think that going to this level of optimization is needed. Or,
if you insist on doing it, that would be a separate patch. The first
patch should really only move things around to group them inside the
#ifdef/#endif, and skip the detection of the ISA device and
registration of the platform driver. You shouldn't have to modify the
actual driver code.

> (...)
> +static int __devinit
> +w83781d_isa_add_driver(void)
> +{
> +	int res;
>  
>  	if (w83781d_isa_found(isa_address)) {
>  		res = platform_driver_register(&w83781d_isa_driver);
>  		if (res)
> -			goto exit_unreg_i2c_driver;
> +			goto exit;
>  
>  		/* Sets global pdev as a side effect */
>  		res = w83781d_isa_device_add(isa_address);
>  		if (res)
>  			goto exit_unreg_isa_driver;
> -	}
>  
> +		/* Use ISA bus to access registers */
> +		w83781d_read_value = w83781d_read_value_isa;
> +		w83781d_write_value = w83781d_write_value_isa;

You can't do that. It is possible, and perfectly valid, to have two
supported chips on the same system, one on the ISA bus and one on an
I2C bus. I do have a system like that, with a W83781D on the
motherboard's ISA bus and a W83783S on the graphics adapter. The bus
type (and thus the register access method) is really a chip-specific
and not driver-wide.

> +	}
>  	return 0;
>  
>   exit_unreg_isa_driver:
>  	platform_driver_unregister(&w83781d_isa_driver);
> - exit_unreg_i2c_driver:
> -	i2c_del_driver(&w83781d_driver);
>   exit:
>  	return res;
>  }

-- 
Jean Delvare




[Index of Archives]     [Linux Kernel]     [Linux Hardware Monitoring]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]

  Powered by Linux