| | 1198 | name => "SMSC EMC1023", |
| | 1199 | driver => "to-be-written", # emc1023 |
| | 1200 | i2c_addrs => [0x48, 0x49, 0x4c, 0x4d], |
| | 1201 | i2c_detect => sub { emc1023_detect(@_, 0); }, |
| | 1202 | }, { |
| | 1203 | name => "SMSC EMC1043", |
| | 1204 | driver => "to-be-written", # emc1023 |
| | 1205 | i2c_addrs => [0x48, 0x49, 0x4c, 0x4d], |
| | 1206 | i2c_detect => sub { emc1023_detect(@_, 1); }, |
| | 1207 | }, { |
| | 1208 | name => "SMSC EMC1053", |
| | 1209 | driver => "to-be-written", # emc1023 |
| | 1210 | i2c_addrs => [0x48, 0x49, 0x4c, 0x4d], |
| | 1211 | i2c_detect => sub { emc1023_detect(@_, 2); }, |
| | 1212 | }, { |
| | 1213 | name => "SMSC EMC1063", |
| | 1214 | driver => "to-be-written", # emc1023 |
| | 1215 | i2c_addrs => [0x48, 0x49, 0x4c, 0x4d], |
| | 1216 | i2c_detect => sub { emc1023_detect(@_, 3); }, |
| | 1217 | }, { |
| | 5390 | } |
| | 5391 | |
| | 5392 | return 7; |
| | 5393 | } |
| | 5394 | |
| | 5395 | # Chips to detect: 0 = EMC1023, 1 = EMC1043, 2 = EMC1053, 3 = EMC1063 |
| | 5396 | # Registers used: |
| | 5397 | # 0xed: Device ID register |
| | 5398 | # 0xfe: Vendor ID register |
| | 5399 | # 0xff: Revision register |
| | 5400 | sub emc1023_detect |
| | 5401 | { |
| | 5402 | my ($file, $addr, $chip) = @_; |
| | 5403 | my $dev_id = i2c_smbus_read_byte_data($file, 0xed); |
| | 5404 | my $man_id = i2c_smbus_read_byte_data($file, 0xfe); |
| | 5405 | my $rev = i2c_smbus_read_byte_data($file, 0xff); |
| | 5406 | |
| | 5407 | return unless $man_id == 0x5d; # SMSC |
| | 5408 | return unless $rev <= 1; |
| | 5409 | |
| | 5410 | if ($chip == 0) { |
| | 5411 | return if ($addr == 0x4c) && ($dev_id != 0x04); # EMC1023-1 |
| | 5412 | return if ($addr == 0x4d) && ($dev_id != 0x05); # EMC1023-2 |
| | 5413 | return if ($addr == 0x48) && ($dev_id != 0x06); # EMC1023-3 |
| | 5414 | return if ($addr == 0x49) && ($dev_id != 0x07); # EMC1023-4 |
| | 5415 | } elsif ($chip == 1) { |
| | 5416 | if ($addr == 0x4c) { # EMC1043-1, EMC1043-5 |
| | 5417 | return unless ($dev_id == 0x0c) || ($dev_id == 0x2c); |
| | 5418 | } |
| | 5419 | return if ($addr == 0x4d) && ($dev_id != 0x0d); # EMC1043-2 |
| | 5420 | return if ($addr == 0x48) && ($dev_id != 0x0e); # EMC1043-3 |
| | 5421 | return if ($addr == 0x49) && ($dev_id != 0x0f); # EMC1043-4 |
| | 5422 | } elsif ($chip == 2) { |
| | 5423 | return if ($addr == 0x4c) && ($dev_id != 0x3c); # EMC1053-1 |
| | 5424 | return if ($addr == 0x4d) && ($dev_id != 0x3d); # EMC1053-2 |
| | 5425 | return if ($addr == 0x48) && ($dev_id != 0x3e); # EMC1053-3 |
| | 5426 | return if ($addr == 0x49) && ($dev_id != 0x3f); # EMC1053-4 |
| | 5427 | } elsif ($chip == 3) { |
| | 5428 | return if ($addr == 0x4c) && ($dev_id != 0x30); # EMC1063-1 |
| | 5429 | return if ($addr == 0x4d) && ($dev_id != 0x31); # EMC1063-2 |
| | 5430 | return if ($addr == 0x48) && ($dev_id != 0x32); # EMC1063-3 |
| | 5431 | return if ($addr == 0x49) && ($dev_id != 0x33); # EMC1063-4 |