You can subscribe to this list here.
| 2006 |
Jan
|
Feb
(4) |
Mar
(135) |
Apr
(130) |
May
(82) |
Jun
(101) |
Jul
(75) |
Aug
(37) |
Sep
(28) |
Oct
(45) |
Nov
(114) |
Dec
(27) |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2007 |
Jan
(22) |
Feb
(60) |
Mar
(81) |
Apr
(120) |
May
(29) |
Jun
(50) |
Jul
(67) |
Aug
(41) |
Sep
(36) |
Oct
(4) |
Nov
(4) |
Dec
|
| 2008 |
Jan
(5) |
Feb
(17) |
Mar
(5) |
Apr
(6) |
May
(5) |
Jun
(9) |
Jul
(5) |
Aug
(1) |
Sep
|
Oct
|
Nov
|
Dec
|
| 2010 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(6) |
Sep
|
Oct
|
Nov
|
Dec
|
| 2011 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(1) |
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
|
From: Nicolas B. <ni...@bo...> - 2007-03-17 19:03:45
|
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hi, Guillaume Pujol wrote: > Hi, > > Attached to this mail you'll can find clean mactel patches for linux > kernel 2.6.20. > They apply against linux 2.6.20 + gentoo patchset + suspend2 without > offset nor fuzz (should apply to unpatched official kernel as well). Ok cool. Personally, when I did this job, I edited the patchfiles manually... Then it was easier for me to do a diff between the files, and check I didn't remove a part of the patch, or modify something... With your patchset it's hard for me to compare... > Also: > - rewritten usbhid.patch which was partly applied to official 2.6.20, > and added HID_QUIRK_IGNORE_MOUSE everywhere it was useful. Just beware of this in include/linux/hid.h: +#define HID_QUIRK_IGNORE_MOUSE 0x00010000 #define HID_QUIRK_BAD_RELATIVE_KEYS 0x00010000 These two constants should have a different values. > - removed a part of applesmc.patch which was redundant with coretemp.patch Which part exactly? I cannot see what you changed because you changed all the tabs in spaces... Also I don't think there is anything in applesmc redundant with coretemp... Thanks, Best regards, Nicolas -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.3 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFF/Dt401ajQnpJXgERAhj0AJ9K0PPWyGwMQpBb5bA1PoqtGdud9ACePvvF JSd54h1L3S32qQdbws4mV/E= =2t8W -----END PGP SIGNATURE----- |
|
From: Guillaume P. <gui...@gm...> - 2007-03-17 12:52:27
|
Hi, Attached to this mail you'll can find clean mactel patches for linux kernel 2.6.20. They apply against linux 2.6.20 + gentoo patchset + suspend2 without offset nor fuzz (should apply to unpatched official kernel as well). Also: - rewritten usbhid.patch which was partly applied to official 2.6.20, and added HID_QUIRK_IGNORE_MOUSE everywhere it was useful. - removed a part of applesmc.patch which was redundant with coretemp.patch I hope you will find it useful :) Regards, |
|
From: Nicolas B. <ni...@bo...> - 2007-03-17 05:59:42
|
Hi, Takashi Iwai wrote: > At Fri, 16 Mar 2007 17:50:33 +0800, > Nicolas Boichat wrote: >> Hi, >> >> I just got this input from a Macmini user (subsys id: 0x106b0800), after >> asking him to try different pins settings. (the sound doesn't work >> properly with a vanilla 2.6.21-rc3 kernel) >> >> Tino Keitel wrote: >>> On Thu, Mar 15, 2007 at 18:12:30 +0800, Nicolas Boichat wrote: >>> >>> [...] >>> >>> >>>> Considered it worked with the mactel patches, you should try >>>> STAC_MACBOOK_PRO_V1 first.... >>>> >>> You are right, with STAC_MACBOOK_PRO_V1 I can use all required >>> features. Here are the results: >>> >>> - analog line in works, if "Line In as Output" is muted >>> >>> - analog line out works, it is controlled by the "Front" channel in >>> alsamixer >>> >>> - digital line out works >>> >>> - the internal speaker works, it is controlled by the "Master" channel >>> in alsamixer >>> >>> - the internal speaker is silent if there is an analog plug in line out >>> >>> - the internal speker still works if a (optical) digital cable is >>> plugged in line out, I guess because the optical plastic cable >>> doesn't short circuit the line out plug >>> >>> Minor glitches: >>> >>> There is an input selector that has the options "Line", "Mic" and >>> "Front Mic". However, I think that only "Line" is really usable, as I >>> had so signal when I connected a Mic to line in and a "Front Mic" is >>> also not present in the mini. >>> >>> There is a "Mic as output" switch in alsamixer, but there is not "Mic" >>> jack. >>> >> Considering these pins have been used for a long time on mactel-linux, > > Grrr, someone should have informed us. I didn't know of this. Sorry... Was quite busy recently, and I'm trying to get all our patches upstream now... >> and that they are working fine with MacBook (1st generation at least), >> Macmini and Macbook Pro (1st generation only), I think the following >> patch is appropriate (please apply it after the patch sent yesterday). > > But the glitches above don't appear on your macbook-pro-v1, right? Yeah I have some glitches too... For "Input source" I have "Front Mic", "Mic" and "Line", while only "Mic" and "Line" are useful. I also have a Mic as Output which is not relevant (no Mic jack)... I'll try to have a look at this. Also, to get the Mic to work, even if the "Input Source" is set to Mic at boot time, I have to switch to Line or Front Mic and then back to Mic. > Then I suppose macmini requires slightly different pin configs for > inputs. As for now, I think it's OK to use macbook-pro-v1 pin configs > for macmini since it's much better. So, how about to just keep the > models and change the pin definitions to use the same table? I saw your patch. Thx. Best regards, Nicolas |
|
From: Takashi I. <ti...@su...> - 2007-03-16 14:28:58
|
At Fri, 16 Mar 2007 12:08:08 +0100,
I wrote:
>
> At Fri, 16 Mar 2007 17:50:33 +0800,
> Nicolas Boichat wrote:
> >
> > Hi,
> >
> > I just got this input from a Macmini user (subsys id: 0x106b0800), after
> > asking him to try different pins settings. (the sound doesn't work
> > properly with a vanilla 2.6.21-rc3 kernel)
> >
> > Tino Keitel wrote:
> > > On Thu, Mar 15, 2007 at 18:12:30 +0800, Nicolas Boichat wrote:
> > >
> > > [...]
> > >
> > >
> > >> Considered it worked with the mactel patches, you should try
> > >> STAC_MACBOOK_PRO_V1 first....
> > >>
> > >
> > > You are right, with STAC_MACBOOK_PRO_V1 I can use all required
> > > features. Here are the results:
> > >
> > > - analog line in works, if "Line In as Output" is muted
> > >
> > > - analog line out works, it is controlled by the "Front" channel in
> > > alsamixer
> > >
> > > - digital line out works
> > >
> > > - the internal speaker works, it is controlled by the "Master" channel
> > > in alsamixer
> > >
> > > - the internal speaker is silent if there is an analog plug in line out
> > >
> > > - the internal speker still works if a (optical) digital cable is
> > > plugged in line out, I guess because the optical plastic cable
> > > doesn't short circuit the line out plug
> > >
> > > Minor glitches:
> > >
> > > There is an input selector that has the options "Line", "Mic" and
> > > "Front Mic". However, I think that only "Line" is really usable, as I
> > > had so signal when I connected a Mic to line in and a "Front Mic" is
> > > also not present in the mini.
> > >
> > > There is a "Mic as output" switch in alsamixer, but there is not "Mic"
> > > jack.
> > >
> > Considering these pins have been used for a long time on mactel-linux,
>
> Grrr, someone should have informed us. I didn't know of this.
>
> > and that they are working fine with MacBook (1st generation at least),
> > Macmini and Macbook Pro (1st generation only), I think the following
> > patch is appropriate (please apply it after the patch sent yesterday).
>
> But the glitches above don't appear on your macbook-pro-v1, right?
> Then I suppose macmini requires slightly different pin configs for
> inputs. As for now, I think it's OK to use macbook-pro-v1 pin configs
> for macmini since it's much better. So, how about to just keep the
> models and change the pin definitions to use the same table?
Well, what I meant is simpler fix like below.
In case, macmini or macbook has any slightly incompatible pin configs,
it can have again its own pin config table easily.
Takashi
diff -r 530b211fffdb pci/hda/patch_sigmatel.c
--- a/pci/hda/patch_sigmatel.c Fri Mar 16 15:01:36 2007 +0100
+++ b/pci/hda/patch_sigmatel.c Fri Mar 16 15:04:06 2007 +0100
@@ -524,12 +524,6 @@ static unsigned int d945gtp5_pin_configs
0x02a19320, 0x40000100,
};
-static unsigned int macbook_pin_configs[10] = {
- 0x0321e230, 0x03a1e020, 0x400000fd, 0x9017e110,
- 0x400000fe, 0x0381e021, 0x1345e240, 0x13c5e22e,
- 0x400000fc, 0x400000fb,
-};
-
static unsigned int macbook_pro_v1_pin_configs[10] = {
0x0321e230, 0x03a1e020, 0x9017e110, 0x01014010,
0x01a19021, 0x0381e021, 0x1345e240, 0x13c5e22e,
@@ -546,8 +540,8 @@ static unsigned int *stac922x_brd_tbl[ST
[STAC_D945_REF] = ref922x_pin_configs,
[STAC_D945GTP3] = d945gtp3_pin_configs,
[STAC_D945GTP5] = d945gtp5_pin_configs,
- [STAC_MACMINI] = d945gtp5_pin_configs,
- [STAC_MACBOOK] = macbook_pin_configs,
+ [STAC_MACMINI] = macbook_pro_v1_pin_configs,
+ [STAC_MACBOOK] = macbook_pro_v1_pin_configs,
[STAC_MACBOOK_PRO_V1] = macbook_pro_v1_pin_configs,
[STAC_MACBOOK_PRO_V2] = macbook_pro_v2_pin_configs,
};
|
|
From: Takashi I. <ti...@su...> - 2007-03-16 11:08:23
|
At Fri, 16 Mar 2007 17:50:33 +0800,
Nicolas Boichat wrote:
>
> Hi,
>
> I just got this input from a Macmini user (subsys id: 0x106b0800), after
> asking him to try different pins settings. (the sound doesn't work
> properly with a vanilla 2.6.21-rc3 kernel)
>
> Tino Keitel wrote:
> > On Thu, Mar 15, 2007 at 18:12:30 +0800, Nicolas Boichat wrote:
> >
> > [...]
> >
> >
> >> Considered it worked with the mactel patches, you should try
> >> STAC_MACBOOK_PRO_V1 first....
> >>
> >
> > You are right, with STAC_MACBOOK_PRO_V1 I can use all required
> > features. Here are the results:
> >
> > - analog line in works, if "Line In as Output" is muted
> >
> > - analog line out works, it is controlled by the "Front" channel in
> > alsamixer
> >
> > - digital line out works
> >
> > - the internal speaker works, it is controlled by the "Master" channel
> > in alsamixer
> >
> > - the internal speaker is silent if there is an analog plug in line out
> >
> > - the internal speker still works if a (optical) digital cable is
> > plugged in line out, I guess because the optical plastic cable
> > doesn't short circuit the line out plug
> >
> > Minor glitches:
> >
> > There is an input selector that has the options "Line", "Mic" and
> > "Front Mic". However, I think that only "Line" is really usable, as I
> > had so signal when I connected a Mic to line in and a "Front Mic" is
> > also not present in the mini.
> >
> > There is a "Mic as output" switch in alsamixer, but there is not "Mic"
> > jack.
> >
> Considering these pins have been used for a long time on mactel-linux,
Grrr, someone should have informed us. I didn't know of this.
> and that they are working fine with MacBook (1st generation at least),
> Macmini and Macbook Pro (1st generation only), I think the following
> patch is appropriate (please apply it after the patch sent yesterday).
But the glitches above don't appear on your macbook-pro-v1, right?
Then I suppose macmini requires slightly different pin configs for
inputs. As for now, I think it's OK to use macbook-pro-v1 pin configs
for macmini since it's much better. So, how about to just keep the
models and change the pin definitions to use the same table?
thanks,
Takashi
>
> Best regards,
>
> Nicolas
>
> Fix audio on Macmini and Macbook.
>
> Signed-off-by: Nicolas Boichat <ni...@bo...>
>
> ---
>
> Documentation/sound/alsa/ALSA-Configuration.txt | 5 ++--
> sound/pci/hda/patch_sigmatel.c | 27 +++++------------------
> 2 files changed, 8 insertions(+), 24 deletions(-)
>
> diff --git a/Documentation/sound/alsa/ALSA-Configuration.txt b/Documentation/sound/alsa/ALSA-Configuration.txt
> index 438f3fe..c13885a 100644
> --- a/Documentation/sound/alsa/ALSA-Configuration.txt
> +++ b/Documentation/sound/alsa/ALSA-Configuration.txt
> @@ -904,9 +904,8 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
> ref Reference board
> 3stack D945 3stack
> 5stack D945 5stack + SPDIF
> - macmini Intel Mac Mini
> - macbook Intel Mac Book
> - macbook-pro-v1 Intel Mac Book Pro 1st generation
> + mac Intel Mac
> + (Mac Mini, Mac Book, Mac Book Pro 1st generation)
> macbook-pro Intel Mac Book Pro 2nd generation
>
> STAC9202/9250/9251
> diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c
> index 2d78a9f..1293632 100644
> --- a/sound/pci/hda/patch_sigmatel.c
> +++ b/sound/pci/hda/patch_sigmatel.c
> @@ -58,9 +58,7 @@ enum {
> STAC_D945_REF,
> STAC_D945GTP3,
> STAC_D945GTP5,
> - STAC_MACMINI,
> - STAC_MACBOOK,
> - STAC_MACBOOK_PRO_V1,
> + STAC_MAC,
> STAC_MACBOOK_PRO_V2,
> STAC_922X_MODELS
> };
> @@ -524,13 +522,7 @@ static unsigned int d945gtp5_pin_configs[10] = {
> 0x02a19320, 0x40000100,
> };
>
> -static unsigned int macbook_pin_configs[10] = {
> - 0x0321e230, 0x03a1e020, 0x400000fd, 0x9017e110,
> - 0x400000fe, 0x0381e021, 0x1345e240, 0x13c5e22e,
> - 0x400000fc, 0x400000fb,
> -};
> -
> -static unsigned int macbook_pro_v1_pin_configs[10] = {
> +static unsigned int mac_pin_configs[10] = {
> 0x0321e230, 0x03a1e020, 0x9017e110, 0x01014010,
> 0x01a19021, 0x0381e021, 0x1345e240, 0x13c5e22e,
> 0x02a19320, 0x400000fb
> @@ -546,9 +538,7 @@ static unsigned int *stac922x_brd_tbl[STAC_922X_MODELS] = {
> [STAC_D945_REF] = ref922x_pin_configs,
> [STAC_D945GTP3] = d945gtp3_pin_configs,
> [STAC_D945GTP5] = d945gtp5_pin_configs,
> - [STAC_MACMINI] = d945gtp5_pin_configs,
> - [STAC_MACBOOK] = macbook_pin_configs,
> - [STAC_MACBOOK_PRO_V1] = macbook_pro_v1_pin_configs,
> + [STAC_MAC] = mac_pin_configs,
> [STAC_MACBOOK_PRO_V2] = macbook_pro_v2_pin_configs,
> };
>
> @@ -556,9 +546,7 @@ static const char *stac922x_models[STAC_922X_MODELS] = {
> [STAC_D945_REF] = "ref",
> [STAC_D945GTP5] = "5stack",
> [STAC_D945GTP3] = "3stack",
> - [STAC_MACMINI] = "macmini",
> - [STAC_MACBOOK] = "macbook",
> - [STAC_MACBOOK_PRO_V1] = "macbook-pro-v1",
> + [STAC_MAC] = "mac",
> [STAC_MACBOOK_PRO_V2] = "macbook-pro",
> };
>
> @@ -622,7 +610,7 @@ static struct snd_pci_quirk stac922x_cfg_tbl[] = {
> /* other systems */
> /* Apple Mac Mini (early 2006) */
> SND_PCI_QUIRK(0x8384, 0x7680,
> - "Mac Mini", STAC_MACMINI),
> + "Intel Mac", STAC_MAC),
> {} /* terminator */
> };
>
> @@ -1893,16 +1881,13 @@ static int patch_stac922x(struct hda_codec *codec)
> spec->board_config = snd_hda_check_board_config(codec, STAC_922X_MODELS,
> stac922x_models,
> stac922x_cfg_tbl);
> - if (spec->board_config == STAC_MACMINI) {
> + if (spec->board_config == STAC_MAC) {
> spec->gpio_mute = 1;
> /* Intel Macs have all same PCI SSID, so we need to check
> * codec SSID to distinguish the exact models
> */
> printk(KERN_INFO "hda_codec: STAC922x, Apple subsys_id=%x\n", codec->subsystem_id);
> switch (codec->subsystem_id) {
> - case 0x106b0200: /* MacBook Pro first generation */
> - spec->board_config = STAC_MACBOOK_PRO_V1;
> - break;
> case 0x106b1e00: /* MacBook Pro second generation */
> spec->board_config = STAC_MACBOOK_PRO_V2;
> break;
>
>
|
|
From: Nicolas B. <ni...@bo...> - 2007-03-16 09:51:24
|
Hi,
I just got this input from a Macmini user (subsys id: 0x106b0800), after
asking him to try different pins settings. (the sound doesn't work
properly with a vanilla 2.6.21-rc3 kernel)
Tino Keitel wrote:
> On Thu, Mar 15, 2007 at 18:12:30 +0800, Nicolas Boichat wrote:
>
> [...]
>
>
>> Considered it worked with the mactel patches, you should try
>> STAC_MACBOOK_PRO_V1 first....
>>
>
> You are right, with STAC_MACBOOK_PRO_V1 I can use all required
> features. Here are the results:
>
> - analog line in works, if "Line In as Output" is muted
>
> - analog line out works, it is controlled by the "Front" channel in
> alsamixer
>
> - digital line out works
>
> - the internal speaker works, it is controlled by the "Master" channel
> in alsamixer
>
> - the internal speaker is silent if there is an analog plug in line out
>
> - the internal speker still works if a (optical) digital cable is
> plugged in line out, I guess because the optical plastic cable
> doesn't short circuit the line out plug
>
> Minor glitches:
>
> There is an input selector that has the options "Line", "Mic" and
> "Front Mic". However, I think that only "Line" is really usable, as I
> had so signal when I connected a Mic to line in and a "Front Mic" is
> also not present in the mini.
>
> There is a "Mic as output" switch in alsamixer, but there is not "Mic"
> jack.
>
Considering these pins have been used for a long time on mactel-linux,
and that they are working fine with MacBook (1st generation at least),
Macmini and Macbook Pro (1st generation only), I think the following
patch is appropriate (please apply it after the patch sent yesterday).
Best regards,
Nicolas
Fix audio on Macmini and Macbook.
Signed-off-by: Nicolas Boichat <ni...@bo...>
---
Documentation/sound/alsa/ALSA-Configuration.txt | 5 ++--
sound/pci/hda/patch_sigmatel.c | 27 +++++------------------
2 files changed, 8 insertions(+), 24 deletions(-)
diff --git a/Documentation/sound/alsa/ALSA-Configuration.txt b/Documentation/sound/alsa/ALSA-Configuration.txt
index 438f3fe..c13885a 100644
--- a/Documentation/sound/alsa/ALSA-Configuration.txt
+++ b/Documentation/sound/alsa/ALSA-Configuration.txt
@@ -904,9 +904,8 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
ref Reference board
3stack D945 3stack
5stack D945 5stack + SPDIF
- macmini Intel Mac Mini
- macbook Intel Mac Book
- macbook-pro-v1 Intel Mac Book Pro 1st generation
+ mac Intel Mac
+ (Mac Mini, Mac Book, Mac Book Pro 1st generation)
macbook-pro Intel Mac Book Pro 2nd generation
STAC9202/9250/9251
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c
index 2d78a9f..1293632 100644
--- a/sound/pci/hda/patch_sigmatel.c
+++ b/sound/pci/hda/patch_sigmatel.c
@@ -58,9 +58,7 @@ enum {
STAC_D945_REF,
STAC_D945GTP3,
STAC_D945GTP5,
- STAC_MACMINI,
- STAC_MACBOOK,
- STAC_MACBOOK_PRO_V1,
+ STAC_MAC,
STAC_MACBOOK_PRO_V2,
STAC_922X_MODELS
};
@@ -524,13 +522,7 @@ static unsigned int d945gtp5_pin_configs[10] = {
0x02a19320, 0x40000100,
};
-static unsigned int macbook_pin_configs[10] = {
- 0x0321e230, 0x03a1e020, 0x400000fd, 0x9017e110,
- 0x400000fe, 0x0381e021, 0x1345e240, 0x13c5e22e,
- 0x400000fc, 0x400000fb,
-};
-
-static unsigned int macbook_pro_v1_pin_configs[10] = {
+static unsigned int mac_pin_configs[10] = {
0x0321e230, 0x03a1e020, 0x9017e110, 0x01014010,
0x01a19021, 0x0381e021, 0x1345e240, 0x13c5e22e,
0x02a19320, 0x400000fb
@@ -546,9 +538,7 @@ static unsigned int *stac922x_brd_tbl[STAC_922X_MODELS] = {
[STAC_D945_REF] = ref922x_pin_configs,
[STAC_D945GTP3] = d945gtp3_pin_configs,
[STAC_D945GTP5] = d945gtp5_pin_configs,
- [STAC_MACMINI] = d945gtp5_pin_configs,
- [STAC_MACBOOK] = macbook_pin_configs,
- [STAC_MACBOOK_PRO_V1] = macbook_pro_v1_pin_configs,
+ [STAC_MAC] = mac_pin_configs,
[STAC_MACBOOK_PRO_V2] = macbook_pro_v2_pin_configs,
};
@@ -556,9 +546,7 @@ static const char *stac922x_models[STAC_922X_MODELS] = {
[STAC_D945_REF] = "ref",
[STAC_D945GTP5] = "5stack",
[STAC_D945GTP3] = "3stack",
- [STAC_MACMINI] = "macmini",
- [STAC_MACBOOK] = "macbook",
- [STAC_MACBOOK_PRO_V1] = "macbook-pro-v1",
+ [STAC_MAC] = "mac",
[STAC_MACBOOK_PRO_V2] = "macbook-pro",
};
@@ -622,7 +610,7 @@ static struct snd_pci_quirk stac922x_cfg_tbl[] = {
/* other systems */
/* Apple Mac Mini (early 2006) */
SND_PCI_QUIRK(0x8384, 0x7680,
- "Mac Mini", STAC_MACMINI),
+ "Intel Mac", STAC_MAC),
{} /* terminator */
};
@@ -1893,16 +1881,13 @@ static int patch_stac922x(struct hda_codec *codec)
spec->board_config = snd_hda_check_board_config(codec, STAC_922X_MODELS,
stac922x_models,
stac922x_cfg_tbl);
- if (spec->board_config == STAC_MACMINI) {
+ if (spec->board_config == STAC_MAC) {
spec->gpio_mute = 1;
/* Intel Macs have all same PCI SSID, so we need to check
* codec SSID to distinguish the exact models
*/
printk(KERN_INFO "hda_codec: STAC922x, Apple subsys_id=%x\n", codec->subsystem_id);
switch (codec->subsystem_id) {
- case 0x106b0200: /* MacBook Pro first generation */
- spec->board_config = STAC_MACBOOK_PRO_V1;
- break;
case 0x106b1e00: /* MacBook Pro second generation */
spec->board_config = STAC_MACBOOK_PRO_V2;
break;
|
|
From: gimli <gi...@da...> - 2007-03-16 06:49:49
|
Nicolas Boichat schrieb: > Hi, > > th...@m3... wrote: >>> Zitat von Nicolas Boichat <ni...@bo...>: >>> >>>> -----BEGIN PGP SIGNED MESSAGE----- >>>> Hash: SHA1 >>>> >>>> Hi Soeren, >>>> >>>> (copying the list, as it is interesting for them) >>>> >>>> Soeren Sonnenburg wrote: >>>>> Hi Nicolas, >>>>> >>>>> can we agree on that the appletouch and usb-storage-zerowait patch can >>>>> be removed from mactel patches, as they don't provide any extra >>>>> functionality but just satisfy certain developer preferences ? >>>> I agree about usb-storage-zerowait, I don't know who introduced this >>>> patch, and what it is useful for... Maybe this person is still >>>> monitoring the list, in this case it would be nice to have some explanation. >>>> >>> As far as i remember this patch was needed in the first steps of mactel-linux, >>> because in these days there was a problem with the sata controller, which >>> didn't work under linux, so the only way to boot linux on a macbook was an usb >>> storage device attached to the computer. you can only boot from an usb storage >>> device when the usb wait time is set to zero, if not the kernel will not find >>> the root device and will print out a message like "VFS: Cannot open root >>> device". > > Wow, thanks for the explanation... So, basically, this patch has nothing > to do in the SVN, and you have a kernel parameter if you really want to > change it. > > Best regards, > > Nicolas Correct. The second reason was not to destroy the FS on the internal drive :) cu Edgar (gimli) Hucek ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys-and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ Mactel-linux-devel mailing list Mac...@li... https://lists.sourceforge.net/lists/listinfo/mactel-linux-devel |
|
From: Tino K. <tin...@ti...> - 2007-03-15 18:54:42
|
On Thu, Mar 15, 2007 at 18:12:30 +0800, Nicolas Boichat wrote: [...] > Considered it worked with the mactel patches, you should try > STAC_MACBOOK_PRO_V1 first.... You are right, with STAC_MACBOOK_PRO_V1 I can use all required features. Here are the results: - analog line in works, if "Line In as Output" is muted - analog line out works, it is controlled by the "Front" channel in alsamixer - digital line out works - the internal speaker works, it is controlled by the "Master" channel in alsamixer - the internal speaker is silent if there is an analog plug in line out - the internal speker still works if a (optical) digital cable is plugged in line out, I guess because the optical plastic cable doesn't short circuit the line out plug Minor glitches: There is an input selector that has the options "Line", "Mic" and "Front Mic". However, I think that only "Line" is really usable, as I had so signal when I connected a Mic to line in and a "Front Mic" is also not present in the mini. There is a "Mic as output" switch in alsamixer, but there is not "Mic" jack. Regards, Tino |
|
From: Soeren S. <mac...@nn...> - 2007-03-15 15:27:20
|
On Wed, 2007-03-14 at 14:12 +0800, Nicolas Boichat wrote: Hi Nicolas, > About appletouch, I don't know exactly... If there is a consensus that > the new value for ATP_THRESHOLD is better, it should probably stay > there, and maybe be sent upstream. OK. Not sure whether this then should not better be a config option controllable via sysfs. > > Apart from the (non-essential) core-temp patch, the patch that should > > really make it into mainline is applesmc. I wonder whether you plan to > > do this for 2.6.22 - such that we finally don't need any extra stuff > > anymore ? > > We can always keep some patches, even if they are non-essential (now > that I figured out how to use git, creating the series of patches for a > new kernel version is really easy). That's true but I don't see the need if all the hw is supported in vanilla linux after applesmc is in. I would rather send patches directly upstream then... > I'll work on applesmc, but don't except it for 2.6.22, as I think 2.6.21 > will be released very shortly, so the feature freeze for 2.6.22 will > happen shortly. I'm also not very sure about the way my code is written, > so it might require some important modifications. Well 2.6.21 will still take >1month to be released so you have 6 weeks I guess... > > Also, how did you find out about all these SMC keys like 'ALV0' etc ? > > By reverse-engineering the OS X driver. wow! how ? Soeren |
|
From: Nicolas B. <ni...@bo...> - 2007-03-15 10:38:55
|
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hello, Tino Keitel wrote: > On Thu, Mar 15, 2007 at 13:45:28 +0800, Nicolas Boichat wrote: >> Tino Keitel wrote: > > [...] > >>> Hi, >>> >>> I also tested 2.6.21-rc3 on my mini and line-in didn't work out of the >>> box. I'll try again with the patch. >> This patch probably won't help... >> >> Did it work before? With which kernel? With or without >> sigmatel_audio.patch applied? > > It did work with 2.6.20 and the sigmatel patch from mactel-linux > SVN. > [snip] >> Replacing XXX by one of this constants (the first one is the one that >> has the better chances to work): >> STAC_D945GTP5 >> STAC_D945_REF >> STAC_D945GTP3 >> STAC_MACBOOK >> STAC_MACBOOK_PRO_V1 >> STAC_MACBOOK_PRO_V2 >> >> And tell me which one works... (please test the internal speaker too) > > OK, I'll try to test it ASAP. Considered it worked with the mactel patches, you should try STAC_MACBOOK_PRO_V1 first.... Best regards, Nicolas -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.3 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFF+RwO01ajQnpJXgERApZ2AJ9xNQt2YHhrbOd62ngVorTki1YMagCfRL+Q ZiAZSOB/ah3HRtx+GTM41pU= =spX+ -----END PGP SIGNATURE----- |
|
From: Tino K. <tin...@ti...> - 2007-03-15 08:36:46
|
On Thu, Mar 15, 2007 at 09:26:33 +0100, Tino Keitel wrote: > On Thu, Mar 15, 2007 at 13:45:28 +0800, Nicolas Boichat wrote: > > # dmesg | grep hda_codec > > > > You should get something like this: > > > > [ 804.570794] hda_codec: STAC922x, Apple subsys_id=106b0200 > > So such line in my kernel logs. But I found it in Oops, all my kernel logs are from 2.6.20. Regards, Tino |
|
From: Tino K. <tin...@ti...> - 2007-03-15 08:26:37
|
On Thu, Mar 15, 2007 at 13:45:28 +0800, Nicolas Boichat wrote: > # dmesg | grep hda_codec > > You should get something like this: > > [ 804.570794] hda_codec: STAC922x, Apple subsys_id=106b0200 So such line in my kernel logs. But I found it in /proc/asound/card0/codec#0: Codec: SigmaTel STAC9221 A1 Address: 0 Vendor Id: 0x83847680 Subsystem Id: 0x106b0800 Revision Id: 0x103401 Regards, Tino |
|
From: Tino K. <tin...@ti...> - 2007-03-15 08:01:44
|
On Thu, Mar 15, 2007 at 13:45:28 +0800, Nicolas Boichat wrote: > Tino Keitel wrote: [...] > > Hi, > > > > I also tested 2.6.21-rc3 on my mini and line-in didn't work out of the > > box. I'll try again with the patch. > > This patch probably won't help... > > Did it work before? With which kernel? With or without > sigmatel_audio.patch applied? It did work with 2.6.20 and the sigmatel patch from mactel-linux SVN. > > After applying the patch (and checking it still doesn't work), please > execute: > > # dmesg | grep hda_codec > > You should get something like this: > > [ 804.570794] hda_codec: STAC922x, Apple subsys_id=106b0200 > > Then, in sound/pci/hda/patch_sigmatel.c, add these lines at 1903 (just > after the switch): > > case 0x<YOUR subsys_id FROM dmesg>: > spec->board_config = XXX; > break; > > Replacing XXX by one of this constants (the first one is the one that > has the better chances to work): > STAC_D945GTP5 > STAC_D945_REF > STAC_D945GTP3 > STAC_MACBOOK > STAC_MACBOOK_PRO_V1 > STAC_MACBOOK_PRO_V2 > > And tell me which one works... (please test the internal speaker too) OK, I'll try to test it ASAP. Regards, Tino |
|
From: <nbo...@us...> - 2007-03-15 06:18:38
|
Revision: 87
http://svn.sourceforge.net/mactel-linux/?rev=87&view=rev
Author: nboichat
Date: 2007-03-14 23:18:32 -0700 (Wed, 14 Mar 2007)
Log Message:
-----------
Remove usb-storage-zerowait.
Update sigmatel-audio (modifications asked by upstream maintainer)
Modified Paths:
--------------
trunk/kernel/mactel-patches-2.6.21/0006-sigmatel_audio.patch
Removed Paths:
-------------
trunk/kernel/mactel-patches-2.6.21/0003-usb-storage-zerowait.patch
Deleted: trunk/kernel/mactel-patches-2.6.21/0003-usb-storage-zerowait.patch
===================================================================
--- trunk/kernel/mactel-patches-2.6.21/0003-usb-storage-zerowait.patch 2007-03-14 18:16:40 UTC (rev 86)
+++ trunk/kernel/mactel-patches-2.6.21/0003-usb-storage-zerowait.patch 2007-03-15 06:18:32 UTC (rev 87)
@@ -1,23 +0,0 @@
-Zero-wait on usb-storage.
-
-From: ? <?>
-
-
----
-
- drivers/usb/storage/usb.c | 2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
-
-diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c
-index 8e898e3..6e33e13 100644
---- a/drivers/usb/storage/usb.c
-+++ b/drivers/usb/storage/usb.c
-@@ -107,7 +107,7 @@ MODULE_AUTHOR("Matthew Dharm <mdh...@on...>");
- MODULE_DESCRIPTION("USB Mass Storage driver for Linux");
- MODULE_LICENSE("GPL");
-
--static unsigned int delay_use = 5;
-+static unsigned int delay_use = 0;
- module_param(delay_use, uint, S_IRUGO | S_IWUSR);
- MODULE_PARM_DESC(delay_use, "seconds to delay before using a new device");
-
Modified: trunk/kernel/mactel-patches-2.6.21/0006-sigmatel_audio.patch
===================================================================
--- trunk/kernel/mactel-patches-2.6.21/0006-sigmatel_audio.patch 2007-03-14 18:16:40 UTC (rev 86)
+++ trunk/kernel/mactel-patches-2.6.21/0006-sigmatel_audio.patch 2007-03-15 06:18:32 UTC (rev 87)
@@ -5,11 +5,26 @@
---
- sound/pci/hda/patch_sigmatel.c | 21 +++++++++++++++++----
- 1 files changed, 17 insertions(+), 4 deletions(-)
+ Documentation/sound/alsa/ALSA-Configuration.txt | 3 ++-
+ sound/pci/hda/patch_sigmatel.c | 25 +++++++++++++++++------
+ 2 files changed, 21 insertions(+), 7 deletions(-)
+diff --git a/Documentation/sound/alsa/ALSA-Configuration.txt b/Documentation/sound/alsa/ALSA-Configuration.txt
+index db398a6..438f3fe 100644
+--- a/Documentation/sound/alsa/ALSA-Configuration.txt
++++ b/Documentation/sound/alsa/ALSA-Configuration.txt
+@@ -906,7 +906,8 @@ Prior to version 0.9.0rc4 options had a 'snd_' prefix. This was removed.
+ 5stack D945 5stack + SPDIF
+ macmini Intel Mac Mini
+ macbook Intel Mac Book
+- macbook-pro Intel Mac Book Pro
++ macbook-pro-v1 Intel Mac Book Pro 1st generation
++ macbook-pro Intel Mac Book Pro 2nd generation
+
+ STAC9202/9250/9251
+ ref Reference board, base config
diff --git a/sound/pci/hda/patch_sigmatel.c b/sound/pci/hda/patch_sigmatel.c
-index 4c7b039..5ee9a82 100644
+index 4c7b039..2d78a9f 100644
--- a/sound/pci/hda/patch_sigmatel.c
+++ b/sound/pci/hda/patch_sigmatel.c
@@ -60,7 +60,8 @@ enum {
@@ -22,26 +37,28 @@
STAC_922X_MODELS
};
-@@ -529,6 +530,12 @@ static unsigned int macbook_pin_configs[10] = {
+@@ -529,7 +530,13 @@ static unsigned int macbook_pin_configs[10] = {
0x400000fc, 0x400000fb,
};
+-static unsigned int macbook_pro_pin_configs[10] = {
+static unsigned int macbook_pro_v1_pin_configs[10] = {
-+ 0x0321E230, 0x03A1E020, 0x9017E110, 0x01014010,
-+ 0x01a19021, 0x0381E021, 0x1345E240, 0x13C5E22E,
-+ 0x02a19320, 0x400000FB,
++ 0x0321e230, 0x03a1e020, 0x9017e110, 0x01014010,
++ 0x01a19021, 0x0381e021, 0x1345e240, 0x13c5e22e,
++ 0x02a19320, 0x400000fb
+};
+
- static unsigned int macbook_pro_pin_configs[10] = {
++static unsigned int macbook_pro_v2_pin_configs[10] = {
0x0221401f, 0x90a70120, 0x01813024, 0x01014010,
0x400000fd, 0x01016011, 0x1345e240, 0x13c5e22e,
+ 0x400000fc, 0x400000fb,
@@ -541,7 +548,8 @@ static unsigned int *stac922x_brd_tbl[STAC_922X_MODELS] = {
[STAC_D945GTP5] = d945gtp5_pin_configs,
[STAC_MACMINI] = d945gtp5_pin_configs,
[STAC_MACBOOK] = macbook_pin_configs,
- [STAC_MACBOOK_PRO] = macbook_pro_pin_configs,
+ [STAC_MACBOOK_PRO_V1] = macbook_pro_v1_pin_configs,
-+ [STAC_MACBOOK_PRO_V2] = macbook_pro_pin_configs,
++ [STAC_MACBOOK_PRO_V2] = macbook_pro_v2_pin_configs,
};
static const char *stac922x_models[STAC_922X_MODELS] = {
@@ -51,7 +68,7 @@
[STAC_MACBOOK] = "macbook",
- [STAC_MACBOOK_PRO] = "macbook-pro",
+ [STAC_MACBOOK_PRO_V1] = "macbook-pro-v1",
-+ [STAC_MACBOOK_PRO_V2] = "macbook-pro-v2",
++ [STAC_MACBOOK_PRO_V2] = "macbook-pro",
};
static struct snd_pci_quirk stac922x_cfg_tbl[] = {
@@ -61,11 +78,12 @@
*/
+ printk(KERN_INFO "hda_codec: STAC922x, Apple subsys_id=%x\n", codec->subsystem_id);
switch (codec->subsystem_id) {
+- case 0x106b1e00:
+- spec->board_config = STAC_MACBOOK_PRO;
+ case 0x106b0200: /* MacBook Pro first generation */
+ spec->board_config = STAC_MACBOOK_PRO_V1;
+ break;
- case 0x106b1e00:
-- spec->board_config = STAC_MACBOOK_PRO;
++ case 0x106b1e00: /* MacBook Pro second generation */
+ spec->board_config = STAC_MACBOOK_PRO_V2;
break;
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: Nicolas B. <ni...@bo...> - 2007-03-15 05:59:57
|
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hi, th...@m3... wrote: > Zitat von Nicolas Boichat <ni...@bo...>: > >> -----BEGIN PGP SIGNED MESSAGE----- >> Hash: SHA1 >> >> Hi Soeren, >> >> (copying the list, as it is interesting for them) >> >> Soeren Sonnenburg wrote: >>> Hi Nicolas, >>> >>> can we agree on that the appletouch and usb-storage-zerowait patch can >>> be removed from mactel patches, as they don't provide any extra >>> functionality but just satisfy certain developer preferences ? >> I agree about usb-storage-zerowait, I don't know who introduced this >> patch, and what it is useful for... Maybe this person is still >> monitoring the list, in this case it would be nice to have some explanation. >> > > As far as i remember this patch was needed in the first steps of mactel-linux, > because in these days there was a problem with the sata controller, which > didn't work under linux, so the only way to boot linux on a macbook was an usb > storage device attached to the computer. you can only boot from an usb storage > device when the usb wait time is set to zero, if not the kernel will not find > the root device and will print out a message like "VFS: Cannot open root > device". Wow, thanks for the explanation... So, basically, this patch has nothing to do in the SVN, and you have a kernel parameter if you really want to change it. Best regards, Nicolas -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.3 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFF+OC401ajQnpJXgERAsFpAJ9rrNYSDOcIRwmAhFOQGnCj3G8zlwCbBlwS oGZ6OUgJij0gswS8863xPMU= =qfQP -----END PGP SIGNATURE----- |
|
From: Nicolas B. <ni...@bo...> - 2007-03-15 05:46:04
|
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hello, Tino Keitel wrote: > On Wed, Mar 14, 2007 at 11:16:41 -0700, nbo...@us... wrote: >> Revision: 86 >> http://svn.sourceforge.net/mactel-linux/?rev=86&view=rev >> Author: nboichat >> Date: 2007-03-14 11:16:40 -0700 (Wed, 14 Mar 2007) >> >> Log Message: >> ----------- >> Add sigmatel_audio patch again, 2.6.21 doesn't work with my Macbook Pro. >> Number the patches so they get applied in the right order. > > Hi, > > I also tested 2.6.21-rc3 on my mini and line-in didn't work out of the > box. I'll try again with the patch. This patch probably won't help... Did it work before? With which kernel? With or without sigmatel_audio.patch applied? After applying the patch (and checking it still doesn't work), please execute: # dmesg | grep hda_codec You should get something like this: [ 804.570794] hda_codec: STAC922x, Apple subsys_id=106b0200 Then, in sound/pci/hda/patch_sigmatel.c, add these lines at 1903 (just after the switch): case 0x<YOUR subsys_id FROM dmesg>: spec->board_config = XXX; break; Replacing XXX by one of this constants (the first one is the one that has the better chances to work): STAC_D945GTP5 STAC_D945_REF STAC_D945GTP3 STAC_MACBOOK STAC_MACBOOK_PRO_V1 STAC_MACBOOK_PRO_V2 And tell me which one works... (please test the internal speaker too) Thanks a lot, Best regards, Nicolas -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.3 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFF+N1401ajQnpJXgERAvQCAJ41imaL9QMyo/QzScdfhjLwjqpfvgCcDTxY tgjlxQtegAEl7pQJ6nVrIJw= =FRl4 -----END PGP SIGNATURE----- |
|
From: Tino K. <tin...@ti...> - 2007-03-14 19:29:45
|
On Wed, Mar 14, 2007 at 11:16:41 -0700, nbo...@us... wrote: > Revision: 86 > http://svn.sourceforge.net/mactel-linux/?rev=86&view=rev > Author: nboichat > Date: 2007-03-14 11:16:40 -0700 (Wed, 14 Mar 2007) > > Log Message: > ----------- > Add sigmatel_audio patch again, 2.6.21 doesn't work with my Macbook Pro. > Number the patches so they get applied in the right order. Hi, I also tested 2.6.21-rc3 on my mini and line-in didn't work out of the box. I'll try again with the patch. Regards, Tino |
|
From: <nbo...@us...> - 2007-03-14 18:16:43
|
Revision: 86
http://svn.sourceforge.net/mactel-linux/?rev=86&view=rev
Author: nboichat
Date: 2007-03-14 11:16:40 -0700 (Wed, 14 Mar 2007)
Log Message:
-----------
Add sigmatel_audio patch again, 2.6.21 doesn't work with my Macbook Pro.
Number the patches so they get applied in the right order.
Modified Paths:
--------------
trunk/kernel/mactel-patches-2.6.21/unapply
Added Paths:
-----------
trunk/kernel/mactel-patches-2.6.21/0001-applesmc.patch
trunk/kernel/mactel-patches-2.6.21/0002-appleir.patch
trunk/kernel/mactel-patches-2.6.21/0003-usb-storage-zerowait.patch
trunk/kernel/mactel-patches-2.6.21/0004-coretemp.patch
trunk/kernel/mactel-patches-2.6.21/0005-appletouch.patch
trunk/kernel/mactel-patches-2.6.21/0006-sigmatel_audio.patch
Removed Paths:
-------------
trunk/kernel/mactel-patches-2.6.21/appleir.patch
trunk/kernel/mactel-patches-2.6.21/applesmc.patch
trunk/kernel/mactel-patches-2.6.21/appletouch.patch
trunk/kernel/mactel-patches-2.6.21/coretemp.patch
trunk/kernel/mactel-patches-2.6.21/usb-storage-zerowait.patch
Added: trunk/kernel/mactel-patches-2.6.21/0001-applesmc.patch
===================================================================
--- trunk/kernel/mactel-patches-2.6.21/0001-applesmc.patch (rev 0)
+++ trunk/kernel/mactel-patches-2.6.21/0001-applesmc.patch 2007-03-14 18:16:40 UTC (rev 86)
@@ -0,0 +1,1029 @@
+This driver provides support for the Apple System Management Controller, which provides an accelerometer (Apple Sudden Motion Sensor), light sensors, temperature sensors, keyboard backlight control and fan control. Only Intel-based Apple's computers are supported (MacBook Pro, MacBook, MacMini).
+
+From: Nicolas Boichat <ni...@bo...>
+
+
+---
+
+ drivers/hwmon/Kconfig | 24 +
+ drivers/hwmon/Makefile | 1
+ drivers/hwmon/applesmc.c | 964 ++++++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 989 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
+index c3d4856..798b91d 100644
+--- a/drivers/hwmon/Kconfig
++++ b/drivers/hwmon/Kconfig
+@@ -593,6 +593,30 @@ config SENSORS_HDAPS
+ Say Y here if you have an applicable laptop and want to experience
+ the awesome power of hdaps.
+
++config SENSORS_APPLESMC
++ tristate "Apple SMC (Motion sensor, light sensor, keyboard backlight)"
++ depends on HWMON && INPUT && X86
++ select NEW_LEDS
++ select LEDS_CLASS
++ default n
++ help
++ This driver provides support for the Apple System Management
++ Controller, which provides an accelerometer (Apple Sudden Motion
++ Sensor), light sensors, temperature sensors, keyboard backlight
++ control and fan control.
++
++ Only Intel-based Apple's computers are supported (MacBook Pro,
++ MacBook, MacMini).
++
++ Data from the different sensors, keyboard backlight control and fan
++ control are accessible via sysfs.
++
++ This driver also provides an absolute input class device, allowing
++ the laptop to act as a pinball machine-esque joystick.
++
++ Say Y here if you have an applicable laptop and want to experience
++ the awesome power of applesmc.
++
+ config HWMON_DEBUG_CHIP
+ bool "Hardware Monitoring Chip debugging messages"
+ depends on HWMON
+diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
+index 4165c27..544f8d8 100644
+--- a/drivers/hwmon/Makefile
++++ b/drivers/hwmon/Makefile
+@@ -20,6 +20,7 @@ obj-$(CONFIG_SENSORS_ADM1026) += adm1026.o
+ obj-$(CONFIG_SENSORS_ADM1029) += adm1029.o
+ obj-$(CONFIG_SENSORS_ADM1031) += adm1031.o
+ obj-$(CONFIG_SENSORS_ADM9240) += adm9240.o
++obj-$(CONFIG_SENSORS_APPLESMC) += applesmc.o
+ obj-$(CONFIG_SENSORS_AMS) += ams/
+ obj-$(CONFIG_SENSORS_ATXP1) += atxp1.o
+ obj-$(CONFIG_SENSORS_DS1621) += ds1621.o
+diff --git a/drivers/hwmon/applesmc.c b/drivers/hwmon/applesmc.c
+new file mode 100644
+index 0000000..3bdd1a8
+--- /dev/null
++++ b/drivers/hwmon/applesmc.c
+@@ -0,0 +1,964 @@
++/*
++ * drivers/hwmon/applesmc.c - driver for Apple's SMC (accelerometer, temperature
++ * sensors, fan control, keyboard backlight control) used in Intel-based Apple
++ * computers.
++ *
++ * Copyright (C) 2007 Nicolas Boichat <ni...@bo...>
++ *
++ * Based on hdaps.c driver:
++ * Copyright (C) 2005 Robert Love <rm...@no...>
++ * Copyright (C) 2005 Jesper Juhl <jes...@gm...>
++ *
++ * Fan control based on smcFanControl:
++ * Copyright (C) 2006 Hendrik Holtmann <hol...@ma...>
++ *
++ * This program is free software; you can redistribute it and/or modify it
++ * under the terms of the GNU General Public License v2 as published by the
++ * Free Software Foundation.
++ *
++ * This program is distributed in the hope that it will be useful, but WITHOUT
++ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
++ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
++ * more details.
++ *
++ * You should have received a copy of the GNU General Public License along with
++ * this program; if not, write to the Free Software Foundation, Inc.,
++ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
++ */
++
++#include <linux/delay.h>
++#include <linux/platform_device.h>
++#include <linux/input.h>
++#include <linux/kernel.h>
++#include <linux/module.h>
++#include <linux/timer.h>
++#include <linux/dmi.h>
++#include <asm/io.h>
++#include <linux/leds.h>
++
++/* data port used by apple SMC */
++#define APPLESMC_DATA_PORT 0x300
++/* command/status port used by apple SMC */
++#define APPLESMC_CMD_PORT 0x304
++
++#define APPLESMC_NR_PORTS 5 /* 0x300-0x304 */
++
++#define APPLESMC_STATUS_MASK 0x0f
++#define APPLESMC_READ_CMD 0x10
++#define APPLESMC_WRITE_CMD 0x11
++
++#define LIGHT_SENSOR_LEFT_KEY "ALV0" //r-o length 6
++#define LIGHT_SENSOR_RIGHT_KEY "ALV1" //r-o length 6
++#define BACKLIGHT_KEY "LKSB" //w-o
++
++#define CLAMSHELL_KEY "MSLD" //r-o length 1 (unused)
++
++#define MOTION_SENSOR_X_KEY "MO_X" //r-o length 2
++#define MOTION_SENSOR_Y_KEY "MO_Y" //r-o length 2
++#define MOTION_SENSOR_Z_KEY "MO_Z" //r-o length 2
++#define MOTION_SENSOR_KEY "MOCN" //r/w length 2
++
++#define FANS_COUNT "FNum" //r-o length 1
++#define FANS_MANUAL "FS! " //r-w length 2
++#define FAN_ACTUAL_SPEED "F0Ac" //r-o length 2
++#define FAN_MIN_SPEED "F0Mn" //r-o length 2
++#define FAN_MAX_SPEED "F0Mx" //r-o length 2
++#define FAN_SAFE_SPEED "F0Sf" //r-o length 2
++#define FAN_TARGET_SPEED "F0Tg" //r-w length 2
++
++/* Temperature sensors keys. First set for Macbook(Pro), second for Macmini */
++static const char* temperature_sensors_sets[][8] = {
++ { "TB0T", "TC0D", "TC0P", "Th0H", "Ts0P", "Th1H", "Ts1P", NULL },
++ { "TC0D", "TC0P", NULL }
++};
++
++#define INIT_TIMEOUT_MSECS 5000 /* wait up to 5s for device init ... */
++#define INIT_WAIT_MSECS 50 /* ... in 50ms increments */
++
++#define APPLESMC_POLL_PERIOD (HZ/20) /* poll for input every 1/20s */
++#define APPLESMC_INPUT_FUZZ 4 /* input event threshold */
++#define APPLESMC_INPUT_FLAT 4
++
++#define SENSOR_X 0
++#define SENSOR_Y 1
++#define SENSOR_Z 2
++
++/* Structure to be passed to DMI_MATCH function */
++struct dmi_match_data {
++/* Indicates whether this computer has an accelerometer. */
++ int accelerometer;
++/* Indicates whether this computer has light sensors and keyboard backlight. */
++ int light;
++/* Indicates which temperature sensors set to use. */
++ int temperature_set;
++};
++
++static int debug = 0;
++static struct platform_device *pdev;
++static s16 rest_x;
++static s16 rest_y;
++static struct timer_list applesmc_timer;
++static struct input_dev *applesmc_idev;
++
++/* Indicates whether this computer has an accelerometer. */
++static unsigned int applesmc_accelerometer = 0;
++
++/* Indicates whether this computer has light sensors and keyboard backlight. */
++static unsigned int applesmc_light = 0;
++
++/* Indicates which temperature sensors set to use. */
++static unsigned int applesmc_temperature_set = 0;
++
++static DECLARE_MUTEX(applesmc_sem);
++
++/*
++ * __wait_status - Wait up to 100ms for the status port to get a certain value
++ * (masked with 0x0f), returning zero if the value is obtained. Callers must
++ * hold applesmc_sem.
++ */
++static int __wait_status(u8 val)
++{
++ unsigned int i;
++
++ val = val & APPLESMC_STATUS_MASK;
++
++ for (i = 0; i < 10000; i++) {
++ if ((inb(APPLESMC_CMD_PORT) & APPLESMC_STATUS_MASK) == val)
++ return 0;
++ udelay(10);
++ }
++
++ printk(KERN_WARNING "applesmc: wait status failed: %x != %x\n",
++ val, inb(APPLESMC_CMD_PORT));
++
++ return -EIO;
++}
++
++/*
++ * applesmc_read_key - reads len bytes from a given key, and put them in buffer.
++ * Returns zero on success or a negative error on failure. Callers must
++ * hold applesmc_sem.
++ */
++static int applesmc_read_key(const char* key, u8* buffer, u8 len)
++{
++ int ret = -EIO;
++ int i;
++
++ outb(APPLESMC_READ_CMD, APPLESMC_CMD_PORT);
++ if (__wait_status(0x0c))
++ goto out;
++
++ for (i = 0; i < 4; i++) {
++ outb(key[i], APPLESMC_DATA_PORT);
++ if (__wait_status(0x04))
++ goto out;
++ }
++ if (debug) printk(KERN_DEBUG "<%s", key);
++
++ outb(len, APPLESMC_DATA_PORT);
++ if (debug) printk(KERN_DEBUG ">%x", len);
++
++ for (i = 0; i < len; i++) {
++ if (__wait_status(0x05))
++ goto out;
++ buffer[i] = inb(APPLESMC_DATA_PORT);
++ if (debug) printk(KERN_DEBUG "<%x", buffer[i]);
++ }
++ if (debug) printk(KERN_DEBUG "\n");
++ ret = 0;
++
++out:
++ return ret;
++}
++
++/*
++ * applesmc_write_key - writes len bytes from buffer to a given key.
++ * Returns zero on success or a negative error on failure. Callers must
++ * hold applesmc_sem.
++ */
++static int applesmc_write_key(const char* key, u8* buffer, u8 len)
++{
++ int ret = -EIO;
++ int i;
++
++ outb(APPLESMC_WRITE_CMD, APPLESMC_CMD_PORT);
++ if (__wait_status(0x0c))
++ goto out;
++
++ for (i = 0; i < 4; i++) {
++ outb(key[i], APPLESMC_DATA_PORT);
++ if (__wait_status(0x04))
++ goto out;
++ }
++
++ outb(len, APPLESMC_DATA_PORT);
++
++ for (i = 0; i < len; i++) {
++ if (__wait_status(0x04))
++ goto out;
++ outb(buffer[i], APPLESMC_DATA_PORT);
++ }
++
++ ret = 0;
++out:
++ return ret;
++}
++
++/*
++ * applesmc_read_motion_sensor - Read motion sensor (X, Y or Z). Callers must
++ * hold applesmc_sem.
++ */
++static int applesmc_read_motion_sensor(int index, s16* value)
++{
++ u8 buffer[2];
++ int ret;
++
++ switch (index) {
++ case SENSOR_X:
++ ret = applesmc_read_key(MOTION_SENSOR_X_KEY, buffer, 2);
++ break;
++ case SENSOR_Y:
++ ret = applesmc_read_key(MOTION_SENSOR_Y_KEY, buffer, 2);
++ break;
++ case SENSOR_Z:
++ ret = applesmc_read_key(MOTION_SENSOR_Z_KEY, buffer, 2);
++ break;
++ default:
++ ret = -EINVAL;
++ }
++
++ *value = ((s16)buffer[0] << 8) | buffer[1];
++
++ return ret;
++}
++
++/*
++ * applesmc_device_init - initialize the accelerometer. Returns zero on success
++ * and negative error code on failure. Can sleep.
++ */
++static int applesmc_device_init(void)
++{
++ int total, ret = -ENXIO;
++ u8 buffer[2];
++
++ if (!applesmc_accelerometer) return 0;
++
++ down(&applesmc_sem);
++
++ for (total = INIT_TIMEOUT_MSECS; total > 0; total -= INIT_WAIT_MSECS) {
++ if (debug) printk(KERN_DEBUG "applesmc try %d\n", total);
++ if (!applesmc_read_key(MOTION_SENSOR_KEY, buffer, 2) &&
++ (buffer[0] != 0x00 || buffer[1] != 0x00)) {
++ if (total == INIT_TIMEOUT_MSECS) {
++ printk(KERN_DEBUG "applesmc: device has"
++ " already been initialized"
++ " (0x%02x, 0x%02x).\n",
++ buffer[0], buffer[1]);
++ }
++ else {
++ printk(KERN_DEBUG "applesmc: device"
++ " successfully initialized"
++ " (0x%02x, 0x%02x).\n",
++ buffer[0], buffer[1]);
++ }
++ ret = 0;
++ goto out;
++ }
++ buffer[0] = 0xe0;
++ buffer[1] = 0x00;
++ applesmc_write_key(MOTION_SENSOR_KEY, buffer, 2);
++ msleep(INIT_WAIT_MSECS);
++ }
++
++ printk(KERN_WARNING "applesmc: failed to init the device\n");
++
++out:
++ up(&applesmc_sem);
++ return ret;
++}
++
++/*
++ * applesmc_get_fan_count - get the number of fans. Callers must NOT hold
++ * applesmc_sem.
++ */
++static int applesmc_get_fan_count(void)
++{
++ int ret;
++ u8 buffer[1];
++
++ down(&applesmc_sem);
++
++ ret = applesmc_read_key(FANS_COUNT, buffer, 1);
++
++ up(&applesmc_sem);
++ if (ret)
++ return ret;
++ else
++ return buffer[0];
++}
++
++/* Device model stuff */
++static int applesmc_probe(struct platform_device *dev)
++{
++ int ret;
++
++ ret = applesmc_device_init();
++ if (ret)
++ return ret;
++
++ printk(KERN_INFO "applesmc: device successfully initialized.\n");
++ return 0;
++}
++
++static int applesmc_resume(struct platform_device *dev)
++{
++ return applesmc_device_init();
++}
++
++static struct platform_driver applesmc_driver = {
++ .probe = applesmc_probe,
++ .resume = applesmc_resume,
++ .driver = {
++ .name = "applesmc",
++ .owner = THIS_MODULE,
++ },
++};
++
++/*
++ * applesmc_calibrate - Set our "resting" values. Callers must
++ * hold applesmc_sem.
++ */
++static void applesmc_calibrate(void)
++{
++ applesmc_read_motion_sensor(SENSOR_X, &rest_x);
++ applesmc_read_motion_sensor(SENSOR_Y, &rest_y);
++}
++
++static void applesmc_mousedev_poll(unsigned long unused)
++{
++ s16 x, y;
++
++ /* Cannot sleep. Try nonblockingly. If we fail, try again later. */
++ if (down_trylock(&applesmc_sem)) {
++ mod_timer(&applesmc_timer, jiffies + APPLESMC_POLL_PERIOD);
++ return;
++ }
++
++ if (applesmc_read_motion_sensor(SENSOR_X, &x))
++ goto out;
++ if (applesmc_read_motion_sensor(SENSOR_Y, &y))
++ goto out;
++
++
++ input_report_abs(applesmc_idev, ABS_X, x - rest_x);
++ input_report_abs(applesmc_idev, ABS_Y, y - rest_y);
++ input_sync(applesmc_idev);
++
++out:
++ mod_timer(&applesmc_timer, jiffies + APPLESMC_POLL_PERIOD);
++
++ up(&applesmc_sem);
++}
++
++/* Sysfs Files */
++
++static ssize_t applesmc_position_show(struct device *dev,
++ struct device_attribute *attr, char *buf)
++{
++ int ret;
++ s16 x, y, z;
++
++ down(&applesmc_sem);
++
++ ret = applesmc_read_motion_sensor(SENSOR_X, &x);
++ if (ret)
++ goto out;
++ ret = applesmc_read_motion_sensor(SENSOR_Y, &y);
++ if (ret)
++ goto out;
++ ret = applesmc_read_motion_sensor(SENSOR_Z, &z);
++ if (ret)
++ goto out;
++
++out:
++ up(&applesmc_sem);
++ if (ret)
++ return ret;
++ else
++ return sprintf(buf, "(%d,%d,%d)\n", x, y, z);
++}
++
++static ssize_t applesmc_light_show(struct device *dev,
++ struct device_attribute *attr, char *buf)
++{
++ int ret;
++ u8 left = 0, right = 0;
++ u8 buffer[6];
++
++ down(&applesmc_sem);
++
++ ret = applesmc_read_key(LIGHT_SENSOR_LEFT_KEY, buffer, 6);
++ left = buffer[2];
++ if (ret)
++ goto out;
++ ret = applesmc_read_key(LIGHT_SENSOR_RIGHT_KEY, buffer, 6);
++ right = buffer[2];
++
++out:
++ up(&applesmc_sem);
++ if (ret)
++ return ret;
++ else
++ return sprintf(buf, "(%d,%d)\n", left, right);
++}
++
++/* Displays °C * 100 */
++static ssize_t applesmc_show_temperature(struct device *dev, char *buf,
++ const char *key)
++{
++ int ret;
++ u8 buffer[2];
++ unsigned int temp;
++
++ down(&applesmc_sem);
++
++ ret = applesmc_read_key(key, buffer, 2);
++ temp = buffer[0]*100;
++ temp += (buffer[1] >> 6) * 25;
++
++ up(&applesmc_sem);
++
++ if (ret)
++ return ret;
++ else
++ return sprintf(buf, "%u\n", temp);
++}
++
++static ssize_t applesmc_show_fan_speed(struct device *dev, char *buf,
++ const char* key, int offset)
++{
++ int ret;
++ unsigned int speed = 0;
++ char newkey[5];
++ u8 buffer[2];
++
++ newkey[0] = key[0];
++ newkey[1] = '0' + offset;
++ newkey[2] = key[2];
++ newkey[3] = key[3];
++ newkey[4] = 0;
++
++ down(&applesmc_sem);
++
++ ret = applesmc_read_key(newkey, buffer, 2);
++ speed = ((buffer[0] << 8 | buffer[1]) >> 2);
++
++ up(&applesmc_sem);
++ if (ret)
++ return ret;
++ else
++ return sprintf(buf, "%u\n", speed);
++}
++
++static ssize_t applesmc_store_fan_speed(struct device *dev, const char *buf,
++ size_t count, const char* key, int offset)
++{
++ int ret;
++ u32 speed;
++ char newkey[5];
++ u8 buffer[2];
++
++ speed = simple_strtoul(buf, NULL, 10);
++
++ if (speed > 0x4000) /* Bigger than a 14-bit value */
++ return -EINVAL;
++
++ newkey[0] = key[0];
++ newkey[1] = '0' + offset;
++ newkey[2] = key[2];
++ newkey[3] = key[3];
++ newkey[4] = 0;
++
++ down(&applesmc_sem);
++
++ buffer[0] = (speed >> 6) & 0xff;
++ buffer[1] = (speed << 2) & 0xff;
++ ret = applesmc_write_key(newkey, buffer, 2);
++
++ up(&applesmc_sem);
++ if (ret)
++ return ret;
++ else
++ return count;
++}
++
++static ssize_t applesmc_show_fan_manual(struct device *dev, char *buf,
++ int offset)
++{
++ int ret;
++ u16 manual = 0;
++ u8 buffer[2];
++
++ down(&applesmc_sem);
++
++ ret = applesmc_read_key(FANS_MANUAL, buffer, 2);
++ manual = ((buffer[0] << 8 | buffer[1]) >> offset) & 0x01;
++
++ up(&applesmc_sem);
++ if (ret)
++ return ret;
++ else
++ return sprintf(buf, "%d\n", manual);
++}
++
++static ssize_t applesmc_store_fan_manual(struct device *dev, const char *buf,
++ size_t count, int offset)
++{
++ int ret;
++ u8 buffer[2];
++ u32 input;
++ u16 val;
++
++ input = simple_strtoul(buf, NULL, 10);
++
++ down(&applesmc_sem);
++
++ ret = applesmc_read_key(FANS_MANUAL, buffer, 2);
++ val = (buffer[0] << 8 | buffer[1]);
++ if (ret)
++ goto out;
++
++ if (input)
++ val = val | (0x01 << offset);
++ else
++ val = val & ~(0x01 << offset);
++
++ buffer[0] = (val >> 8) & 0xFF;
++ buffer[1] = val & 0xFF;
++
++ ret = applesmc_write_key(FANS_MANUAL, buffer, 2);
++
++out:
++ up(&applesmc_sem);
++ if (ret)
++ return ret;
++ else
++ return count;
++}
++
++static ssize_t applesmc_calibrate_show(struct device *dev,
++ struct device_attribute *attr, char *buf)
++{
++ return sprintf(buf, "(%d,%d)\n", rest_x, rest_y);
++}
++
++static ssize_t applesmc_calibrate_store(struct device *dev,
++ struct device_attribute *attr, const char *buf, size_t count)
++{
++ down(&applesmc_sem);
++ applesmc_calibrate();
++ up(&applesmc_sem);
++
++ return count;
++}
++
++static void applesmc_backlight_set(struct led_classdev *led_cdev,
++ enum led_brightness value)
++{
++ u8 buffer[2];
++
++ down(&applesmc_sem);
++ buffer[0] = value;
++ buffer[1] = 0x00;
++ applesmc_write_key(BACKLIGHT_KEY, buffer, 2);
++ up(&applesmc_sem);
++}
++
++static struct led_classdev applesmc_backlight = {
++ .name = "smc:kbd_backlight",
++ .default_trigger = "nand-disk",
++ .brightness_set = applesmc_backlight_set,
++};
++
++static DEVICE_ATTR(position, 0444, applesmc_position_show, NULL);
++static DEVICE_ATTR(calibrate, 0644,
++ applesmc_calibrate_show, applesmc_calibrate_store);
++
++static DEVICE_ATTR(light, 0444, applesmc_light_show, NULL);
++
++/*
++ * Macro defining helper functions and DEVICE_ATTR for a fan sysfs entries.
++ * - show actual speed
++ * - show/store minimum speed
++ * - show maximum speed
++ * - show safe speed
++ * - show/store target speed
++ * - show/store manual mode
++ */
++#define sysfs_fan_speeds_offset(offset) \
++static ssize_t show_fan_actual_speed_##offset (struct device *dev, \
++ struct device_attribute *attr, char *buf) \
++{ \
++ return applesmc_show_fan_speed(dev, buf, FAN_ACTUAL_SPEED, offset); \
++} \
++static DEVICE_ATTR(fan##offset##_actual_speed, S_IRUGO, \
++ show_fan_actual_speed_##offset, NULL); \
++\
++static ssize_t show_fan_minimum_speed_##offset (struct device *dev, \
++ struct device_attribute *attr, char *buf) \
++{ \
++ return applesmc_show_fan_speed(dev, buf, FAN_MIN_SPEED, offset); \
++} \
++static ssize_t store_fan_minimum_speed_##offset (struct device *dev, \
++ struct device_attribute *attr, const char *buf, size_t count) \
++{ \
++ return applesmc_store_fan_speed(dev, buf, count, FAN_MIN_SPEED, offset); \
++} \
++static DEVICE_ATTR(fan##offset##_minimum_speed, S_IRUGO | S_IWUSR, \
++ show_fan_minimum_speed_##offset, store_fan_minimum_speed_##offset); \
++\
++static ssize_t show_fan_maximum_speed_##offset (struct device *dev, \
++ struct device_attribute *attr, char *buf) \
++{ \
++ return applesmc_show_fan_speed(dev, buf, FAN_MAX_SPEED, offset); \
++} \
++static DEVICE_ATTR(fan##offset##_maximum_speed, S_IRUGO, \
++ show_fan_maximum_speed_##offset, NULL); \
++\
++static ssize_t show_fan_safe_speed_##offset (struct device *dev, \
++ struct device_attribute *attr, char *buf) \
++{ \
++ return applesmc_show_fan_speed(dev, buf, FAN_SAFE_SPEED, offset); \
++} \
++static DEVICE_ATTR(fan##offset##_safe_speed, S_IRUGO, \
++ show_fan_safe_speed_##offset, NULL); \
++\
++static ssize_t show_fan_target_speed_##offset (struct device *dev, \
++ struct device_attribute *attr, char *buf) \
++{ \
++ return applesmc_show_fan_speed(dev, buf, FAN_TARGET_SPEED, offset); \
++} \
++static ssize_t store_fan_target_speed_##offset (struct device *dev, \
++ struct device_attribute *attr, const char *buf, size_t count) \
++{ \
++ return applesmc_store_fan_speed(dev, buf, count, FAN_TARGET_SPEED, offset); \
++} \
++static DEVICE_ATTR(fan##offset##_target_speed, S_IRUGO | S_IWUSR, \
++ show_fan_target_speed_##offset, store_fan_target_speed_##offset); \
++static ssize_t show_fan_manual_##offset (struct device *dev, \
++ struct device_attribute *attr, char *buf) \
++{ \
++ return applesmc_show_fan_manual(dev, buf, offset); \
++} \
++static ssize_t store_fan_manual_##offset (struct device *dev, \
++ struct device_attribute *attr, const char *buf, size_t count) \
++{ \
++ return applesmc_store_fan_manual(dev, buf, count, offset); \
++} \
++static DEVICE_ATTR(fan##offset##_manual, S_IRUGO | S_IWUSR, \
++ show_fan_manual_##offset, store_fan_manual_##offset);
++
++/*
++ * Create the needed functions for each fan using the macro defined above
++ * (2 fans are supported)
++ */
++sysfs_fan_speeds_offset(0);
++sysfs_fan_speeds_offset(1);
++
++/* Macro creating the sysfs entries for a fan */
++#define device_create_file_fan(ret, client, offset) \
++do { \
++ret = sysfs_create_file(client, &dev_attr_fan##offset##_actual_speed.attr); \
++if (ret) break; \
++ret = sysfs_create_file(client, &dev_attr_fan##offset##_minimum_speed.attr); \
++if (ret) break; \
++ret = sysfs_create_file(client, &dev_attr_fan##offset##_maximum_speed.attr); \
++if (ret) break; \
++ret = sysfs_create_file(client, &dev_attr_fan##offset##_safe_speed.attr); \
++if (ret) break; \
++ret = sysfs_create_file(client, &dev_attr_fan##offset##_target_speed.attr); \
++if (ret) break; \
++ret = sysfs_create_file(client, &dev_attr_fan##offset##_manual.attr); \
++} while (0)
++
++/*
++ * Macro defining the helper function and DEVICE_ATTR for a temperature sensor
++ * sysfs entry.
++ */
++#define sysfs_temperature_offset(offset) \
++static ssize_t show_temperature_##offset (struct device *dev, \
++ struct device_attribute *attr, char *buf) \
++{ \
++ return applesmc_show_temperature(dev, buf, \
++ temperature_sensors_sets[applesmc_temperature_set][offset]); \
++} \
++static DEVICE_ATTR(temperature_##offset, S_IRUGO, \
++ show_temperature_##offset, NULL);
++
++/*
++ * Create the needed functions for each temperature sensors using the macro
++ * defined above (7 temperature sensors are supported)
++ */
++sysfs_temperature_offset(0);
++sysfs_temperature_offset(1);
++sysfs_temperature_offset(2);
++sysfs_temperature_offset(3);
++sysfs_temperature_offset(4);
++sysfs_temperature_offset(5);
++sysfs_temperature_offset(6);
++
++/* Macro creating the sysfs entry for a temperature sensor */
++#define device_create_files_temperature(ret, client, offset) \
++{ \
++ ret = sysfs_create_file(client, &dev_attr_temperature_##offset.attr); \
++} while (0)
++
++/* Module stuff */
++
++/*
++ * applesmc_dmi_match - found a match. return one, short-circuiting the hunt.
++ */
++static int applesmc_dmi_match(struct dmi_system_id *id)
++{
++ int i = 0;
++ struct dmi_match_data* dmi_data =
++ (struct dmi_match_data*)id->driver_data;
++ printk(KERN_INFO "applesmc: %s detected:\n", id->ident);
++ applesmc_accelerometer = dmi_data->accelerometer;
++ printk(KERN_INFO "applesmc: - Model %s accelerometer\n",
++ applesmc_accelerometer ? "with" : "without");
++ applesmc_light = dmi_data->light;
++ printk(KERN_INFO "applesmc: - Model %s light sensors and backlight\n",
++ applesmc_light ? "with" : "without");
++
++ applesmc_temperature_set = dmi_data->temperature_set;
++ while (temperature_sensors_sets[applesmc_temperature_set][i] != NULL)
++ i++;
++ printk(KERN_INFO "applesmc: - Model with %d temperature sensors\n", i);
++ return 1;
++}
++
++/* Create accelerometer ressources */
++static int applesmc_create_accelerometer(void) {
++ int ret;
++
++ ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_position.attr);
++ if (ret)
++ goto out;
++
++ ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_calibrate.attr);
++ if (ret)
++ goto out;
++
++ applesmc_idev = input_allocate_device();
++ if (!applesmc_idev) {
++ ret = -ENOMEM;
++ goto out;
++ }
++
++ /* initial calibrate for the input device */
++ applesmc_calibrate();
++
++ /* initialize the input class */
++ applesmc_idev->name = "applesmc";
++ applesmc_idev->cdev.dev = &pdev->dev;
++ applesmc_idev->evbit[0] = BIT(EV_ABS);
++ input_set_abs_params(applesmc_idev, ABS_X,
++ -256, 256, APPLESMC_INPUT_FUZZ, APPLESMC_INPUT_FLAT);
++ input_set_abs_params(applesmc_idev, ABS_Y,
++ -256, 256, APPLESMC_INPUT_FUZZ, APPLESMC_INPUT_FLAT);
++
++ input_register_device(applesmc_idev);
++
++ /* start up our timer for the input device */
++ init_timer(&applesmc_timer);
++ applesmc_timer.function = applesmc_mousedev_poll;
++ applesmc_timer.expires = jiffies + APPLESMC_POLL_PERIOD;
++ add_timer(&applesmc_timer);
++
++ return 0;
++
++out:
++ printk(KERN_WARNING "applesmc: driver init failed (ret=%d)!\n", ret);
++ return ret;
++}
++
++/* Release all ressources used by the accelerometer */
++static void applesmc_release_accelerometer(void) {
++ del_timer_sync(&applesmc_timer);
++ input_unregister_device(applesmc_idev);
++}
++
++static int __init applesmc_init(void)
++{
++ int ret;
++ int count;
++
++ struct dmi_match_data applesmc_dmi_data[] = {
++ /* MacBook Pro: accelerometer, backlight and temperature set 0 */
++ { .accelerometer = 1, .light = 1, .temperature_set = 0 },
++ /* MacBook: accelerometer and temperature set 0 */
++ { .accelerometer = 1, .light = 0, .temperature_set = 0 },
++ /* MacBook: temperature set 1 */
++ { .accelerometer = 0, .light = 0, .temperature_set = 1 }
++ };
++
++ /* Note that DMI_MATCH(...,"MacBook") will match "MacBookPro1,1".
++ * So we need to put "Apple MacBook Pro" before "Apple MacBook". */
++ struct dmi_system_id applesmc_whitelist[] = {
++ { applesmc_dmi_match, "Apple MacBook Pro", {
++ DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
++ DMI_MATCH(DMI_PRODUCT_NAME,"MacBookPro") },
++ (void*)&applesmc_dmi_data[0]},
++ { applesmc_dmi_match, "Apple MacBook", {
++ DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
++ DMI_MATCH(DMI_PRODUCT_NAME,"MacBook") },
++ (void*)&applesmc_dmi_data[1]},
++ { applesmc_dmi_match, "Apple Macmini", {
++ DMI_MATCH(DMI_BOARD_VENDOR,"Apple"),
++ DMI_MATCH(DMI_PRODUCT_NAME,"Macmini") },
++ (void*)&applesmc_dmi_data[2]},
++ { .ident = NULL }
++ };
++
++ if (!dmi_check_system(applesmc_whitelist)) {
++ printk(KERN_WARNING "applesmc: supported laptop not found!\n");
++ ret = -ENODEV;
++ goto out;
++ }
++
++ if (!request_region(APPLESMC_DATA_PORT, APPLESMC_NR_PORTS,
++ "applesmc")) {
++ ret = -ENXIO;
++ goto out;
++ }
++
++ ret = platform_driver_register(&applesmc_driver);
++ if (ret)
++ goto out_region;
++
++ pdev = platform_device_register_simple("applesmc", -1, NULL, 0);
++ if (IS_ERR(pdev)) {
++ ret = PTR_ERR(pdev);
++ goto out_driver;
++ }
++
++ /* create fan files */
++ count = applesmc_get_fan_count();
++ if (count < 0) {
++ printk(KERN_ERR "applesmc: Cannot get the number of fans.\n");
++ }
++ else {
++ printk(KERN_INFO "applesmc: %d fans found.\n", count);
++
++ switch (count) {
++ default:
++ printk(KERN_WARNING "applesmc: More than 2 fans found,"
++ " but at most 2 fans are supported"
++ " by the driver.\n");
++ case 2:
++ device_create_file_fan(ret, &pdev->dev.kobj, 1);
++ if (ret)
++ goto out_device;
++ case 1:
++ device_create_file_fan(ret, &pdev->dev.kobj, 0);
++ if (ret)
++ goto out_device;
++ case 0:
++ ;
++ }
++ }
++
++ count = 0;
++ while (temperature_sensors_sets[applesmc_temperature_set][count]
++ != NULL)
++ count++;
++
++ switch (count) {
++ default:
++ case 7:
++ device_create_files_temperature(ret, &pdev->dev.kobj, 6);
++ if (ret)
++ goto out_device;
++ case 6:
++ device_create_files_temperature(ret, &pdev->dev.kobj, 5);
++ if (ret)
++ goto out_device;
++ case 5:
++ device_create_files_temperature(ret, &pdev->dev.kobj, 4);
++ if (ret)
++ goto out_device;
++ case 4:
++ device_create_files_temperature(ret, &pdev->dev.kobj, 3);
++ if (ret)
++ goto out_device;
++ case 3:
++ device_create_files_temperature(ret, &pdev->dev.kobj, 2);
++ if (ret)
++ goto out_device;
++ case 2:
++ device_create_files_temperature(ret, &pdev->dev.kobj, 1);
++ if (ret)
++ goto out_device;
++ case 1:
++ device_create_files_temperature(ret, &pdev->dev.kobj, 0);
++ if (ret)
++ goto out_device;
++ case 0:
++ ;
++ }
++
++ if (applesmc_accelerometer) {
++ ret = applesmc_create_accelerometer();
++ if (ret)
++ goto out_device;
++ }
++
++ if (applesmc_light) {
++ /* Add light sensor file */
++ ret = sysfs_create_file(&pdev->dev.kobj, &dev_attr_light.attr);
++ if (ret)
++ goto out_accelerometer;
++
++ /* register as a led device */
++ ret = led_classdev_register(&pdev->dev, &applesmc_backlight);
++ if (ret < 0)
++ goto out_accelerometer;
++ }
++
++ printk(KERN_INFO "applesmc: driver successfully loaded.\n");
++ return 0;
++
++out_accelerometer:
++ if (applesmc_accelerometer)
++ applesmc_release_accelerometer();
++out_device:
++ platform_device_unregister(pdev);
++out_driver:
++ platform_driver_unregister(&applesmc_driver);
++out_region:
++ release_region(APPLESMC_DATA_PORT, APPLESMC_NR_PORTS);
++out:
++ printk(KERN_WARNING "applesmc: driver init failed (ret=%d)!\n", ret);
++ return ret;
++}
++
++static void __exit applesmc_exit(void)
++{
++ if (applesmc_light)
++ led_classdev_unregister(&applesmc_backlight);
++ if (applesmc_accelerometer)
++ applesmc_release_accelerometer();
++ platform_device_unregister(pdev);
++ platform_driver_unregister(&applesmc_driver);
++ release_region(APPLESMC_DATA_PORT, APPLESMC_NR_PORTS);
++
++ printk(KERN_INFO "applesmc: driver unloaded.\n");
++}
++
++module_init(applesmc_init);
++module_exit(applesmc_exit);
++
++MODULE_AUTHOR("Nicolas Boichat");
++MODULE_DESCRIPTION("Apple SMC");
++MODULE_LICENSE("GPL v2");
Added: trunk/kernel/mactel-patches-2.6.21/0002-appleir.patch
===================================================================
--- trunk/kernel/mactel-patches-2.6.21/0002-appleir.patch (rev 0)
+++ trunk/kernel/mactel-patches-2.6.21/0002-appleir.patch 2007-03-14 18:16:40 UTC (rev 86)
@@ -0,0 +1,435 @@
+Apple IR patch.
+
+From: ? <?>
+
+
+---
+
+ drivers/usb/input/Kconfig | 4
+ drivers/usb/input/Makefile | 1
+ drivers/usb/input/appleir.c | 390 +++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 395 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/usb/input/Kconfig b/drivers/usb/input/Kconfig
+index 69a9f3b..f88c132 100644
+--- a/drivers/usb/input/Kconfig
++++ b/drivers/usb/input/Kconfig
+@@ -185,6 +185,10 @@ config USB_ACECAD
+ To compile this driver as a module, choose M here: the
+ module will be called acecad.
+
++config USB_APPLEIR
++ tristate "Apple Mac Mini USB IR receiver (built in)"
++ depends on USB && INPUT
++
+ config USB_KBTAB
+ tristate "KB Gear JamStudio tablet support"
+ depends on USB && INPUT
+diff --git a/drivers/usb/input/Makefile b/drivers/usb/input/Makefile
+index a9d206c..31c2509 100644
+--- a/drivers/usb/input/Makefile
++++ b/drivers/usb/input/Makefile
+@@ -36,6 +36,7 @@ obj-$(CONFIG_USB_ATI_REMOTE2) += ati_remote2.o
+ obj-$(CONFIG_USB_HID) += usbhid.o
+ obj-$(CONFIG_USB_KBD) += usbkbd.o
+ obj-$(CONFIG_USB_KBTAB) += kbtab.o
++obj-$(CONFIG_USB_APPLEIR) += appleir.o
+ obj-$(CONFIG_USB_KEYSPAN_REMOTE) += keyspan_remote.o
+ obj-$(CONFIG_USB_MOUSE) += usbmouse.o
+ obj-$(CONFIG_USB_MTOUCH) += mtouchusb.o
+diff --git a/drivers/usb/input/appleir.c b/drivers/usb/input/appleir.c
+new file mode 100644
+index 0000000..dc5f604
+--- /dev/null
++++ b/drivers/usb/input/appleir.c
+@@ -0,0 +1,390 @@
++#include <linux/kernel.h>
++#include <linux/slab.h>
++#include <linux/input.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/usb.h>
++#include <linux/usb/input.h>
++#include <asm/unaligned.h>
++#include <asm/byteorder.h>
++
++/*
++ * Version Information
++ *
++ */
++
++#if 0
++#define DUMP_PACKETS
++#else
++#undef DUMP_PACKETS
++#endif
++
++#define DRIVER_VERSION "v1.1"
++#define DRIVER_AUTHOR "James McKenzie"
++#define DRIVER_DESC "USB Apple MacMini IR Receiver driver"
++#define DRIVER_LICENSE "GPL"
++
++MODULE_AUTHOR (DRIVER_AUTHOR);
++MODULE_DESCRIPTION (DRIVER_DESC);
++MODULE_LICENSE (DRIVER_LICENSE);
++
++#ifndef USB_VENDOR_ID_APPLE
++#define USB_VENDOR_ID_APPLE 0x05ac
++#endif
++#ifndef USB_DEVICE_ID_APPLE_IR
++#define USB_DEVICE_ID_APPLE_IR 0x8240
++#endif
++
++#define URB_SIZE 32
++
++#define MAX_KEYS 8
++#define MAX_KEYS_MASK (MAX_KEYS - 1 )
++
++struct appleir
++{
++ struct input_dev *dev;
++ uint8_t *data;
++ dma_addr_t dma_buf;
++ struct usb_device *usbdev;
++ struct urb *urb;
++ int timer_initted;
++ struct timer_list key_up_timer;
++ int current_key;
++ char phys[32];
++};
++
++
++static struct usb_device_id appleir_ids[] = {
++ {USB_DEVICE (USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IR),.driver_info = 0},
++ {}
++};
++
++MODULE_DEVICE_TABLE (usb, appleir_ids);
++
++
++/* I have two devices both of which report the following */
++/* 25 87 ee 83 0a + */
++/* 25 87 ee 83 0c - */
++/* 25 87 ee 83 09 << */
++/* 25 87 ee 83 06 >> */
++/* 25 87 ee 83 05 >" */
++/* 25 87 ee 83 03 menu */
++/* 26 00 00 00 00 for key repeat*/
++
++/* Thomas Glanzmann reports the following responses */
++/* 25 87 ee ca 0b + */
++/* 25 87 ee ca 0d - */
++/* 25 87 ee ca 08 << */
++/* 25 87 ee ca 07 >> */
++/* 25 87 ee ca 04 >" */
++/* 25 87 ee ca 02 menu */
++/* 26 00 00 00 00 for key repeat*/
++/* He also observes the following event sometimes */
++/* sent after a key is release, which I interpret */
++/* as a flat battery message */
++/* 25 87 e0 ca 06 flat battery */
++
++
++static int keymap[MAX_KEYS] = {
++ KEY_RESERVED, KEY_MENU,
++ KEY_PLAYPAUSE, KEY_NEXTSONG,
++ KEY_PREVIOUSSONG, KEY_VOLUMEUP,
++ KEY_VOLUMEDOWN, KEY_RESERVED
++};
++
++static void
++dump_packet (struct appleir *appleir, char *msg, uint8_t * data, int len)
++{
++ int i;
++
++ printk (KERN_ERR "appleir: %s (%d bytes)", msg, len);
++
++ for (i = 0; i < len; ++i)
++ {
++ printk (" %02x", data[i]);
++ }
++
++ printk ("\n");
++}
++
++
++static void
++key_up (struct appleir *appleir, int key)
++{
++ //printk (KERN_ERR "key %d up\n", key);
++ input_report_key (appleir->dev, key, 0);
++ input_sync (appleir->dev);
++}
++
++static void
++key_down (struct appleir *appleir, int key)
++{
++ //printk (KERN_ERR "key %d down\n", key);
++ input_report_key (appleir->dev, key, 1);
++ input_sync (appleir->dev);
++}
++
++static void
++battery_flat (struct appleir *appleir)
++{
++ printk (KERN_ERR "appleir: possible flat battery?\n");
++}
++
++static void
++key_up_tick (unsigned long data)
++{
++ struct appleir *appleir = (struct appleir *) data;
++
++ if (appleir->current_key)
++ {
++ key_up (appleir, appleir->current_key);
++ appleir->current_key = 0;
++ }
++}
++
++static void
++new_data (struct appleir *appleir, uint8_t * data, int len)
++{
++ static const uint8_t keydown[] = { 0x25, 0x87, 0xee };
++ static const uint8_t keyrepeat[] = { 0x26, 0x00, 0x00, 0x00, 0x00 };
++ static const uint8_t flatbattery[] = { 0x25, 0x87, 0xe0 };
++
++#ifdef DUMP_PACKETS
++ dump_packet (appleir, "received", data, len);
++#endif
++
++ if (len != 5)
++ return;
++
++ if (!memcmp (data, keydown, sizeof (keydown)))
++ {
++ /*If we already have a key down, take it up before marking */
++ /*this one down */
++ if (appleir->current_key)
++ key_up (appleir, appleir->current_key);
++ appleir->current_key = keymap[(data[4] >> 1) & MAX_KEYS_MASK];
++
++ key_down (appleir, appleir->current_key);
++ /*remote doesn't do key up, either pull them up, in the test */
++ /*above, or here set a timer which pulls them up after 1/8 s */
++ mod_timer (&appleir->key_up_timer, jiffies + HZ / 8);
++
++ return;
++ }
++
++ if (!memcmp (data, keyrepeat, sizeof (keyrepeat)))
++ {
++ key_down (appleir, appleir->current_key);
++ /*remote doesn't do key up, either pull them up, in the test */
++ /*above, or here set a timer which pulls them up after 1/8 s */
++ mod_timer (&appleir->key_up_timer, jiffies + HZ / 8);
++ return;
++ }
++
++ if (!memcmp (data, flatbattery, sizeof (flatbattery)))
++ {
++ battery_flat (appleir);
++ /*Fall through */
++ }
++
++ dump_packet (appleir, "unknown packet", data, len);
++}
++
++static void
++appleir_urb (struct urb *urb, struct pt_regs *regs)
++{
++ struct appleir *appleir = urb->context;
++ int retval;
++
++ switch (urb->status)
++ {
++ case 0:
++ new_data (appleir, urb->transfer_buffer, urb->actual_length);
++ break;
++ case -ECONNRESET:
++ case -ENOENT:
++ case -ESHUTDOWN:
++ /* this urb is terminated, clean up */
++ dbg ("%s - urb shutting down with status: %d", __FUNCTION__,
++ urb->status);
++ return;
++ default:
++ dbg ("%s - nonzero urb status received: %d", __FUNCTION__, urb->status);
++ }
++
++ retval = usb_submit_urb (urb, GFP_ATOMIC);
++ if (retval)
++ err ("%s - usb_submit_urb failed with result %d", __FUNCTION__, retval);
++}
++
++
++static int
++appleir_open (struct input_dev *dev)
++{
++ struct appleir *appleir = dev->private;
++
++ //appleir->urb->dev = appleir->usbdev;
++
++ if (usb_submit_urb (appleir->urb, GFP_KERNEL))
++ return -EIO;
++
++ return 0;
++}
++
++static void
++appleir_close (struct input_dev *dev)
++{
++ struct appleir *appleir = dev->private;
++ usb_kill_urb (appleir->urb);
++ del_timer_sync (&appleir->key_up_timer);
++}
++
++
++
++
++static int
++appleir_probe (struct usb_interface *intf, const struct usb_device_id *id)
++{
++ struct usb_device *dev = interface_to_usbdev (intf);
++ struct usb_endpoint_descriptor *endpoint;
++ struct appleir *appleir = NULL;
++ struct input_dev *input_dev;
++ int i;
++
++ appleir = kzalloc (sizeof (struct appleir), GFP_KERNEL);
++ if (!appleir)
++ goto fail;
++
++ memset (appleir, 0, sizeof (struct appleir));
++
++
++ appleir->data =
++ usb_buffer_alloc (dev, URB_SIZE, GFP_KERNEL, &appleir->dma_buf);
++ if (!appleir->data)
++ goto fail;
++
++ appleir->urb = usb_alloc_urb (0, GFP_KERNEL);
++ if (!appleir->urb)
++ goto fail;
++
++ appleir->usbdev = dev;
++
++ input_dev = input_allocate_device ();
++ if (!input_dev)
++ goto fail;
++
++ appleir->dev = input_dev;
++
++
++ usb_make_path (dev, appleir->phys, sizeof (appleir->phys));
++ strlcpy (appleir->phys, "/input0", sizeof (appleir->phys));
++
++ input_dev->name = "Apple Mac mini infrared remote control driver";
++ input_dev->phys = appleir->phys;
++ usb_to_input_id (dev, &input_dev->id);
++ input_dev->cdev.dev = &intf->dev;
++ input_dev->private = appleir;
++
++ input_dev->evbit[0] = BIT (EV_KEY) | BIT (EV_REP);
++ input_dev->ledbit[0] = 0;
++
++ for (i = 0; i < MAX_KEYS; i++)
++ {
++ set_bit (keymap[i], input_dev->keybit);
++ }
++
++ clear_bit (0, input_dev->keybit);
++
++ input_dev->open = appleir_open;
++ input_dev->close = appleir_close;
++
++ endpoint = &intf->cur_altsetting->endpoint[0].desc;
++
++ usb_fill_int_urb (appleir->urb, dev,
++ usb_rcvintpipe (dev, endpoint->bEndpointAddress),
++ appleir->data, 8,
++ appleir_urb, appleir, endpoint->bInterval);
++
++ appleir->urb->transfer_dma = appleir->dma_buf;
++ appleir->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
++
++ usb_set_intfdata (intf, appleir);
++
++ init_timer (&appleir->key_up_timer);
++
++ appleir->key_up_timer.function = key_up_tick;
++ appleir->key_up_timer.data = (unsigned long) appleir;
++
++ appleir->timer_initted++;
++
++ input_register_device (appleir->dev);
++
++ return 0;
++
++fail:
++
++ if (appleir)
++ {
++
++
++ if (appleir->data)
++ usb_buffer_free (dev, URB_SIZE, appleir->data, appleir->dma_buf);
++
++ if (appleir->timer_initted)
++ del_timer_sync (&appleir->key_up_timer);
++
++ if (appleir->dev)
++ input_free_device (appleir->dev);
++
++ kfree (appleir);
++ }
++
++ return -ENOMEM;
++}
++
++static void
++appleir_disconnect (struct usb_interface *intf)
++{
++ struct appleir *appleir = usb_get_intfdata (intf);
++
++ usb_set_intfdata (intf, NULL);
++ if (appleir)
++ {
++ input_unregister_device (appleir->dev);
++ if (appleir->timer_initted)
++ del_timer_sync (&appleir->key_up_timer);
++ usb_kill_urb (appleir->urb);
++ usb_free_urb (appleir->urb);
++ usb_buffer_free (interface_to_usbdev (intf), URB_SIZE, appleir->data,
++ appleir->dma_buf);
++ kfree (appleir);
++ }
++}
++
++static struct usb_driver appleir_driver = {
++ .name = "appleir",
++ .probe = appleir_probe,
++ .disconnect = appleir_disconnect,
++ .id_table = appleir_ids,
++};
++
++static int __init
++appleir_init (void)
++{
++ int retval;
++ retval = usb_register (&appleir_driver);
++ if (retval)
++ goto out;
++ info (DRIVER_VERSION ":" DRIVER_DESC);
++out:
++ return retval;
++}
++
++static void __exit
++appleir_exit (void)
++{
++ usb_deregister (&appleir_driver);
++}
++
++module_init (appleir_init);
++module_exit (appleir_exit);
Added: trunk/kernel/mactel-patches-2.6.21/0003-usb-storage-zerowait.patch
===================================================================
--- trunk/kernel/mactel-patches-2.6.21/0003-usb-storage-zerowait.patch (rev 0)
+++ trunk/kernel/mactel-patches-2.6.21/0003-usb-storage-zerowait.patch 2007-03-14 18:16:40 UTC (rev 86)
@@ -0,0 +1,23 @@
+Zero-wait on usb-storage.
+
+From: ? <?>
+
+
+---
+
+ drivers/usb/storage/usb.c | 2 +-
+ 1 files changed, 1 insertions(+), 1 deletions(-)
+
+diff --git a/drivers/usb/storage/usb.c b/drivers/usb/storage/usb.c
+index 8e898e3..6e33e13 100644
+--- a/drivers/usb/storage/usb.c
++++ b/drivers/usb/storage/usb.c
+@@ -107,7 +107,7 @@ MODULE_AUTHOR("Matthew Dharm <mdh...@on...>");
+ MODULE_DESCRIPTION("USB Mass Storage driver for Linux");
+ MODULE_LICENSE("GPL");
+
+-static unsigned int delay_use = 5;
++static unsigned int delay_use = 0;
+ module_param(delay_use, uint, S_IRUGO | S_IWUSR);
+ MODULE_PARM_DESC(delay_use, "seconds to delay before using a new device");
+
Added: trunk/kernel/mactel-patches-2.6.21/0004-coretemp.patch
===================================================================
--- trunk/kernel/mactel-patches-2.6.21/0004-coretemp.patch (rev 0)
+++ trunk/kernel/mactel-patches-2.6.21/0004-coretemp.patch 2007-03-14 18:16:40 UTC (rev 86)
@@ -0,0 +1,589 @@
+Intel Core CPU temperature monitor driver.
+
+From: lm-sensors mailing list <?>
+
+
+---
+
+ arch/i386/kernel/msr.c | 31 ++--
+ drivers/hwmon/Kconfig | 9 +
+ drivers/hwmon/Makefile | 1
+ drivers/hwmon/coretemp.c | 400 ++++++++++++++++++++++++++++++++++++++++++++++
+ include/asm-i386/msr.h | 3
+ include/asm-x86_64/msr.h | 3
+ 6 files changed, 433 insertions(+), 14 deletions(-)
+
+diff --git a/arch/i386/kernel/msr.c b/arch/i386/kernel/msr.c
+index bcaa6e9..c9a8f88 100644
+--- a/arch/i386/kernel/msr.c
++++ b/arch/i386/kernel/msr.c
+@@ -87,7 +87,7 @@ static void msr_smp_rdmsr(void *cmd_block)
+ cmd->err = rdmsr_eio(cmd->reg, &cmd->data[0], &cmd->data[1]);
+ }
+
+-static inline int do_wrmsr(int cpu, u32 reg, u32 eax, u32 edx)
++int msr_write(int cpu, u32 reg, u32 eax, u32 edx)
+ {
+ struct msr_command cmd;
+ int ret;
+@@ -107,7 +107,7 @@ static inline int do_wrmsr(int cpu, u32 reg, u32 eax, u32 edx)
+ return ret;
+ }
+
+-static inline int do_rdmsr(int cpu, u32 reg, u32 * eax, u32 * edx)
++int msr_read(int cpu, u32 reg, u32 * eax, u32 * edx)
+ {
+ struct msr_command cmd;
+ int ret;
+@@ -131,19 +131,22 @@ static inline int do_rdmsr(int cpu, u32 reg, u32 * eax, u32 * edx)
+
+ #else /* ! CONFIG_SMP */
+
+-static inline int do_wrmsr(int cpu, u32 reg, u32 eax, u32 edx)
++int msr_write(int cpu, u32 reg, u32 eax, u32 edx)
+ {
+ return wrmsr_eio(reg, eax, edx);
+ }
+
+-static inline int do_rdmsr(int cpu, u32 reg, u32 *eax, u32 *edx)
++int msr_read(int cpu, u32 reg, u32 *eax, u32 *edx)
+ {
+ return rdmsr_eio(reg, eax, edx);
+ }
+
+ #endif /* ! CONFIG_SMP */
+
+-static loff_t msr_seek(struct file *file, loff_t offset, int orig)
++EXPORT_SYMBOL_GPL(msr_write);
++EXPORT_SYMBOL_GPL(msr_read);
++
++static loff_t msr_fseek(struct file *file, loff_t offset, int orig)
+ {
+ loff_t ret = -EINVAL;
+
+@@ -161,7 +164,7 @@ static loff_t msr_seek(struct file *file, loff_t offset, int orig)
+ return ret;
+ }
+
+-static ssize_t msr_read(struct file *file, char __user * buf,
++static ssize_t msr_fread(struct file *file, char __user * buf,
+ size_t count, loff_t * ppos)
+ {
+ u32 __user *tmp = (u32 __user *) buf;
+@@ -174,7 +177,7 @@ static ssize_t msr_read(struct file *file, char __user * buf,
+ return -EINVAL; /* Invalid chunk size */
+
+ for (; count; count -= 8) {
+- err = do_rdmsr(cpu, reg, &data[0], &data[1]);
++ err = msr_read(cpu, reg, &data[0], &data[1]);
+ if (err)
+ return err;
+ if (copy_to_user(tmp, &data, 8))
+@@ -185,7 +188,7 @@ static ssize_t msr_read(struct file *file, char __user * buf,
+ return ((char __user *)tmp) - buf;
+ }
+
+-static ssize_t msr_write(struct file *file, const char __user *buf,
++static ssize_t msr_fwrite(struct file *file, const char __user *buf,
+ size_t count, loff_t *ppos)
+ {
+ const u32 __user *tmp = (const u32 __user *)buf;
+@@ -200,7 +203,7 @@ static ssize_t msr_write(struct file *file, const char __user *buf,
+ for (; count; count -= 8) {
+ if (copy_from_user(&data, tmp, 8))
+ return -EFAULT;
+- err = do_wrmsr(cpu, reg, data[0], data[1]);
++ err = msr_write(cpu, reg, data[0], data[1]);
+ if (err)
+ return err;
+ tmp += 2;
+@@ -209,7 +212,7 @@ static ssize_t msr_write(struct file *file, const char __user *buf,
+ return ((char __user *)tmp) - buf;
+ }
+
+-static int msr_open(struct inode *inode, struct file *file)
++static int msr_fopen(struct inode *inode, struct file *file)
+ {
+ unsigned int cpu = iminor(file->f_path.dentry->d_inode);
+ struct cpuinfo_x86 *c = &(cpu_data)[cpu];
+@@ -227,10 +230,10 @@ static int msr_open(struct inode *inode, struct file *file)
+ */
+ static const struct file_operations msr_fops = {
+ .owner = THIS_MODULE,
+- .llseek = msr_seek,
+- .read = msr_read,
+- .write = msr_write,
+- .open = msr_open,
++ .llseek = msr_fseek,
++ .read = msr_fread,
++ .write = msr_fwrite,
++ .open = msr_fopen,
+ };
+
+ static int msr_device_create(int i)
+diff --git a/drivers/hwmon/Kconfig b/drivers/hwmon/Kconfig
+index 798b91d..5278f1d 100644
+--- a/drivers/hwmon/Kconfig
++++ b/drivers/hwmon/Kconfig
+@@ -167,6 +167,15 @@ config SENSORS_ATXP1
+ This driver can also be built as a module. If so, the module
+ will be called atxp1.
+
++config SENSORS_CORETEMP
++ tristate "Intel Core (2) Duo/Solo temperature sensor"
++ depends on HWMON && X86 && EXPERIMENTAL
++ select X86_MSR
++ help
++ If you say yes here you get support for the temperature
++ sensor inside your CPU. Supported all are all known variants
++ of Intel Core family.
++
+ config SENSORS_DS1621
+ tristate "Dallas Semiconductor DS1621 and DS1625"
+ depends on HWMON && I2C
+diff --git a/drivers/hwmon/Makefile b/drivers/hwmon/Makefile
+index 544f8d8..06e86f5 100644
+--- a/drivers/hwmon/Makefile
++++ b/drivers/hwmon/Makefile
+@@ -23,6 +23,7 @@ obj-$(CONFIG_SENSORS_ADM9240) += adm9240.o
+ obj-$(CONFIG_SENSORS_APPLESMC) += applesmc.o
+ obj-$(CONFIG_SENSORS_AMS) += ams/
+ obj-$(CONFIG_SENSORS_ATXP1) += atxp1.o
++obj-$(CONFIG_SENSORS_CORETEMP) += coretemp.o
+ obj-$(CONFIG_SENSORS_DS1621) += ds1621.o
+ obj-$(CONFIG_SENSORS_F71805F) += f71805f.o
+ obj-$(CONFIG_SENSORS_FSCHER) += fscher.o
+diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c
+new file mode 100644
+index 0000000..f139b41
+--- /dev/null
++++ b/drivers/hwmon/coretemp.c
+@@ -0,0 +1,400 @@
++/*
++ * coretemp.c - Linux kernel module for hardware monitoring
++ *
++ * Copyright (C) 2006 Rudolf Marek <r....@as...>
++ *
++ * Inspired from many hwmon drivers
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
++ * 02110-1301 USA.
++ */
++
++#include <linux/module.h>
++#include <linux/delay.h>
++#include <linux/init.h>
++#include <linux/slab.h>
++#include <linux/jiffies.h>
++#include <linux/hwmon.h>
++#include <linux/sysfs.h>
++#include <linux/hwmon-sysfs.h>
++#include <linux/err.h>
++#include <linux/mutex.h>
++#include <linux/list.h>
++#include <linux/platform_device.h>
++#include <asm/msr.h>
++#include <linux/cpu.h>
++
++#define DRVNAME "coretemp"
++
++typedef enum { SHOW_TEMP, SHOW_TJMAX, SHOW_LABEL, SHOW_NAME } SHOW;
++
++/*
++ * Functions declaration
++ */
++
++static struct coretemp_data *coretemp_update_device(struct device *dev);
++
++struct coretemp_data {
++ struct class_device *class_dev;
++ struct mutex update_lock;
++ const char *name;
++ u32 id;
++ char valid; /* zero until following fields are valid */
++ unsigned long last_updated; /* in jiffies */
++ int temp;
++ int tjmax;
++ /* registers values */
++ u32 therm_status;
++};
++
++static struct coretemp_data *coretemp_update_device(struct device *dev);
++
++/*
++ * Sysfs stuff
++ */
++
++
++static ssize_t show_name(struct device *dev, struct device_attribute
++ *devattr, char *buf)
++{
++ int ret;
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct coretemp_data *data = dev_get_drvdata(dev);
++
++ if (attr->index == SHOW_NAME)
++ ret = sprintf(buf, "%s\n", data->name);
++ else /* show label */
++ ret = sprintf(buf, "Core %d\n", data->id);
++ return ret;
++}
++
++static ssize_t show_alarm(struct device *dev, struct device_attribute
++ *devattr, char *buf)
++{
++ struct coretemp_data *data = coretemp_update_device(dev);
++ /* read the Out-of-spec log, never clear */
++ return sprintf(buf, "%d\n", (data->therm_status >> 5) & 1);
++}
++
++static ssize_t show_temp(struct device *dev,
++ struct device_attribute *devattr, char *buf)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct coretemp_data *data = coretemp_update_device(dev);
++ return sprintf(buf, "%d\n",
++ attr->index ==
++ SHOW_TEMP ? data->temp : data->tjmax);
++}
++
++static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL,
++ SHOW_TEMP);
++static SENSOR_DEVICE_ATTR(temp1_crit, S_IRUGO, show_temp, NULL,
++ SHOW_TJMAX);
++static DEVICE_ATTR(temp1_crit_alarm, S_IRUGO, show_alarm, NULL);
++static SENSOR_DEVICE_ATTR(temp1_label, S_IRUGO, show_name, NULL, SHOW_LABEL);
++static SENSOR_DEVICE_ATTR(name, S_IRUGO, show_name, NULL, SHOW_NAME);
++
++static struct attribute *coretemp_attributes[] = {
++ &sensor_dev_attr_name.dev_attr.attr,
++ &sensor_dev_attr_temp1_label.dev_attr.attr,
++ &dev_attr_temp1_crit_alarm.attr,
++ &sensor_dev_attr_temp1_input.dev_attr.attr,
++ &sensor_dev_attr_temp1_crit.dev_attr.attr,
++ NULL
++};
++
++static const struct attribute_group coretemp_group = {
++ .attrs = coretemp_attributes,
++};
++
++static struct coretemp_data *coretemp_update_device(struct device *dev)
++{
++ struct coretemp_data *data = dev_get_drvdata(dev);
++
++ mutex_lock(&data->update_lock);
++
++ if (!data->valid || time_after(jiffies, data->last_updated + HZ)) {
++ u32 eax, edx;
++
++ data->valid = 0;
++ msr_read(data->id, MSR_IA32_THERM_STATUS, &eax, &edx);
++ data->therm_status = eax;
++
++ /* update only if data has been valid */
++ if (eax & 0x80000000) {
++ data->temp = data->tjmax - (((data->therm_status >> 16)
++ & 0x7f) * 1000);
++ data->valid = 1;
++ }
++ data->last_updated = jiffies;
++ }
++
++ mutex_unlock(&data->update_lock);
++ return data;
++}
++
++static int __devinit coretemp_probe(struct platform_device *pdev)
++{
++ struct coretemp_data *data;
++ struct cpuinfo_x86 *c = &(cpu_data)[pdev->id];
++ int err;
++ u32 eax, edx;
++
++ if (!(data = kzalloc(sizeof(struct coretemp_data), GFP_KERNEL))) {
++ err = -ENOMEM;
++ dev_err(&pdev->dev, "Out of memory\n");
++ goto exit;
++ }
++
++ data->id = pdev->id;
++ data->name = "coretemp";
++ mutex_init(&data->update_lock);
++ /* Tjmax default is 100C */
++ data->tjmax = 100000;
++
++ /* Some processors have Tjmax 85 following magic should detect it */
++ /* family is always 0x6 */
++
++ if (((c->x86_model == 0xf) && (c->x86_mask > 3 )) ||
++ (c->x86_model == 0xe)) {
++
++ err = msr_read(data->id, 0xee, &eax, &edx);
++ if (err) {
++ dev_warn(&pdev->dev,
++ "Unable to access MSR 0xEE, Tjmax left at %d\n",
++ data->tjmax);
++ } else if (eax & 0x40000000) {
++ data->tjmax = 85000;
++ }
++ }
++
++ /* test if we can access the THERM_STATUS MSR */
++ err = msr_read(data->id, MSR_IA32_THERM_STATUS, &eax, &edx);
++
++ if (err) {
++ dev_err(&pdev->dev,
++ "Unable to access THERM_STATUS MSR, giving up\n");
++ goto exit_free;
++ }
++ platform_set_drvdata(pdev, data);
++
++ if ((err = sysfs_create_group(&pdev->dev.kobj, &coretemp_group)))
++ goto exit_free;
++
++ data->class_dev = hwmon_device_register(&pdev->dev);
++ if (IS_ERR(data->class_dev)) {
++ err = PTR_ERR(data->class_dev);
++ dev_err(&pdev->dev, "Class registration failed (%d)\n",
++ err);
++ goto exit_class;
++ }
++
++ return 0;
++
++exit_class:
++ sysfs_remove_group(&pdev->dev.kobj, &coretemp_group);
++exit_free:
++ kfree(data);
++exit:
++ return err;
++}
++
++static int __devexit coretemp_remove(struct platform_device *pdev)
++{
++ struct coretemp_data *data = platform_get_drvdata(pdev);
++
++ hwmon_device_unregister(data->class_dev);
++ sysfs_remove_group(&pdev->dev.kobj, &coretemp_group);
++ platform_set_drvdata(pdev, NULL);
++ kfree(data);
++ return 0;
++}
++
++static struct platform_driver coretemp_driver = {
++ .driver = {
++ .owner = THIS_MODULE,
++ .name = DRVNAME,
++ },
++ .probe = coretemp_probe,
++ .remove = __devexit_p(coretemp_remove),
++};
++
++struct pdev_entry {
++ struct list_head list;
++ struct platform_device *pdev;
++ unsigned int cpu;
++};
++
++static LIST_HEAD(pdev_list);
++static DEFINE_MUTEX(pdev_list_mutex);
++
++static int __cpuinit coretemp_devices_add(unsigned int cpu)
++{
++ int err;
++ struct platform_device *pdev;
++ struct pdev_entry *pdev_entry;
++
++ pdev = platform_device_alloc(DRVNAME, cpu);
++ if (!pdev) {
++ err = -ENOMEM;
++ printk(KERN_ERR DRVNAME ": Device allocation failed\n");
++ goto exit;
++
++ }
++
++ pdev_entry = kzalloc(sizeof(struct pdev_entry), GFP_KERNEL);
++
++ if (!pdev_entry) {
++ err = -ENOMEM;
++ goto exit_device_put;
++ }
++
++ err = platform_device_add(pdev);
++
++ if (err) {
++ printk(KERN_ERR DRVNAME ": Device addition failed (%d)\n",
++ err);
++ goto exit_device_free;
++ }
++
++ pdev_entry->pdev = pdev;
++ pdev_entry->cpu = cpu;
++ mutex_lock(&pdev_list_mutex);
++ list_add_tail(&pdev_entry->list, &pdev_list);
++ mutex_unlock(&pdev_list_mutex);
++
++ return 0;
++
++exit_device_free:
++ kfree(pdev_entry);
++exit_device_put:
++ platform_device_put(pdev);
++exit:
++ return err;
++}
++
++#ifdef CONFIG_HOTPLUG_CPU
++void coretemp_devices_remove(unsigned int cpu)
++{
++ struct pdev_entry *p, *n;
++ mutex_lock(&pdev_list_mutex);
++ list_for_each_entry_safe(p, n, &pdev_list, list) {
++ if (p->cpu == cpu) {
++ platform_device_unregister(p->pdev);
++ list_del(&p->list);
++ kfree(p);
++ }
++ }
++ mutex_unlock(&pdev_list_mutex);
++}
++
++static int coretemp_cpu_callback(struct notifier_block *nfb,
++ unsigned long action, void *hcpu)
++{
++ unsigned int cpu = (unsigned long) hcpu;
++
++ switch (action) {
++ case CPU_ONLINE:
++ coretemp_devices_add(cpu);
++ break;
++ case CPU_DEAD:
++ coretemp_devices_remove(cpu);
++ break;
++ }
++ return NOTIFY_OK;
++}
++
++static struct notifier_block __cpuinitdata coretemp_cpu_notifier = {
++ .notifier_call = coretemp_cpu_callback,
++};
++#endif /* !CONFIG_HOTPLUG_CPU */
++
++static int __init coretemp_init(void)
++{
++ int i, err = -ENODEV;
++ struct pdev_entry *p, *n;
++
++ if (current_cpu_data.x86_vendor != X86_VENDOR_INTEL)
++ goto exit;
++
++ err = platform_driver_register(&coretemp_driver);
++ if (err)
++ goto exit;
++
++ for_each_online_cpu(i) {
++ struct cpuinfo_x86 *c = &(cpu_data)[i];
++
++ /* check if family 6, models e, f */
++ if ((c->cpuid_level < 0) || (c->x86 != 0x6) ||
++ !((c->x86_model == 0xe) || (c->x86_model == 0xf))) {
++
++ /* supported CPU not found, but report the unknown
++ family 6 CPU */
++ if ((c->x86 == 0x6) && (c->x86_model > 0xf))
++ printk(KERN_WARNING DRVNAME ": Unknown CPU, please"
++ " report to the lm-...@lm...\n");
++ continue;
++ }
++
++ err = coretemp_devices_add(i);
++ if (err)
++ goto exit_driver;
++ }
++ if (list_empty(&pdev_list)) {
++ err = -ENODEV;
++ goto exit_driver_unreg;
++ }
++
++#ifdef CONFIG_HOTPLUG_CPU
++ register_hotcpu_notifier(&coretemp_cpu_notifier);
++#endif
++ return 0;
++
++exit_driver:
++ mutex_lock(&pdev_list_mutex);
++ list_for_each_entry_safe(p, n, &pdev_list, list) {
++ platform_device_unregister(p->pdev);
++ list_del(&p->list);
++ kfree(p);
++ }
++ mutex_unlock(&pdev_list_mutex);
++exit_driver_unreg:
++ platform_driver_unregister(&coretemp_driver);
++exit:
++ return err;
++}
++
++static void __exit coretemp_exit(void)
++{
++ struct pdev_entry *p, *n;
++#ifdef CONFIG_HOTPLUG_CPU
++ unregister_hotcpu_notifier(&coretemp_cpu_notifier);
++#endif
++ mutex_lock(&pdev_list_mutex);
++ list_for_each_entry_safe(p, n, &pdev_list, list) {
++ platform_device_unregister(p->pdev);
++ list_del(&p->list);
++ kfree(p);
++ }
++ mutex_unlock(&pdev_list_mutex);
++ platform_driver_unregister(&coretemp_driver);
++}
++
++MODULE_AUTHOR("Rudolf Marek <r....@as...>");
++MODULE_DESCRIPTION("Intel Core temperature monitor");
++MODULE_LICENSE("GPL");
++
++module_init(coretemp_init)
++module_exit(coretemp_exit)
+diff --git a/include/asm-i386/msr.h b/include/asm-i386/msr.h
+index ec3b680..ff73a99 100644
+--- a/include/asm-i386/msr.h
++++ b/include/asm-i386/msr.h
+@@ -97,6 +97,9 @@ static inline void wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h)
+ }
+ #endif /* CONFIG_SMP */
+
++int msr_write(int cpu, u32 reg, u32 eax, u32 edx);
++int msr_read(int cpu, u32 reg, u32 *eax, u32 *edx);
++
+ /* symbolic names for some interesting MSRs */
+ /* Intel defined MSRs. */
+ #define MSR_IA32_P5_MC_ADDR 0
+diff --git a/include/asm-x86_64/msr.h b/include/asm-x86_64/msr.h
+index 902f9a5..90662f4 100644
+--- a/include/asm-x86_64/msr.h
++++ b/include/asm-x86_64/msr.h
+@@ -160,6 +160,9 @@ static inline unsigned int cpuid_edx(unsigned int op)
+ #define MSR_IA32_UCODE_WRITE 0x79
+ #define MSR_IA32_UCODE_REV 0x8b
+
++int msr_write(int cpu, u32 reg, u32 eax, u32 edx);
++int msr_read(int cpu, u32 reg, u32 *eax, u32 *edx);
++
+ #ifdef CONFIG_SMP
+ void rdmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 *l, u32 *h);
+ void wrmsr_on_cpu(unsigned int cpu, u32 msr_no, u32 l, u32 h);
Added: trunk/kernel/mactel-patches-2.6.21/0005-appletouch.patch
===================================================================
--- trunk/kernel/mactel-patches-2.6.21/0005-appletouch.patch ...
[truncated message content] |
|
From: Nicolas B. <ni...@bo...> - 2007-03-14 06:13:28
|
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hi Soeren, (copying the list, as it is interesting for them) Soeren Sonnenburg wrote: > Hi Nicolas, > > can we agree on that the appletouch and usb-storage-zerowait patch can > be removed from mactel patches, as they don't provide any extra > functionality but just satisfy certain developer preferences ? I agree about usb-storage-zerowait, I don't know who introduced this patch, and what it is useful for... Maybe this person is still monitoring the list, in this case it would be nice to have some explanation. About appletouch, I don't know exactly... If there is a consensus that the new value for ATP_THRESHOLD is better, it should probably stay there, and maybe be sent upstream. > Apart from the (non-essential) core-temp patch, the patch that should > really make it into mainline is applesmc. I wonder whether you plan to > do this for 2.6.22 - such that we finally don't need any extra stuff > anymore ? We can always keep some patches, even if they are non-essential (now that I figured out how to use git, creating the series of patches for a new kernel version is really easy). I'll work on applesmc, but don't except it for 2.6.22, as I think 2.6.21 will be released very shortly, so the feature freeze for 2.6.22 will happen shortly. I'm also not very sure about the way my code is written, so it might require some important modifications. > Also, how did you find out about all these SMC keys like 'ALV0' etc ? By reverse-engineering the OS X driver. Best regards, Nicolas -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.3 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFF95Jc01ajQnpJXgERAiEZAJ9JcP2eZ4fh2tPVKqqghM57xNmmlwCeOs1v ebjUEGmznkqF61l6wlq7x3Q= =JvOQ -----END PGP SIGNATURE----- |
|
From: <nbo...@us...> - 2007-03-14 05:20:39
|
Revision: 85
http://svn.sourceforge.net/mactel-linux/?rev=85&view=rev
Author: nboichat
Date: 2007-03-13 22:20:38 -0700 (Tue, 13 Mar 2007)
Log Message:
-----------
Fix coretemp patch.
Modified Paths:
--------------
trunk/kernel/mactel-patches-2.6.21/coretemp.patch
Modified: trunk/kernel/mactel-patches-2.6.21/coretemp.patch
===================================================================
--- trunk/kernel/mactel-patches-2.6.21/coretemp.patch 2007-03-14 05:07:48 UTC (rev 84)
+++ trunk/kernel/mactel-patches-2.6.21/coretemp.patch 2007-03-14 05:20:38 UTC (rev 85)
@@ -5,12 +5,13 @@
---
- arch/i386/kernel/msr.c | 31 +++++++++++++++++--------------
- drivers/hwmon/Kconfig | 9 +++++++++
- drivers/hwmon/Makefile | 1 +
- include/asm-i386/msr.h | 3 +++
- include/asm-x86_64/msr.h | 3 +++
- 5 files changed, 33 insertions(+), 14 deletions(-)
+ arch/i386/kernel/msr.c | 31 ++--
+ drivers/hwmon/Kconfig | 9 +
+ drivers/hwmon/Makefile | 1
+ drivers/hwmon/coretemp.c | 400 ++++++++++++++++++++++++++++++++++++++++++++++
+ include/asm-i386/msr.h | 3
+ include/asm-x86_64/msr.h | 3
+ 6 files changed, 433 insertions(+), 14 deletions(-)
diff --git a/arch/i386/kernel/msr.c b/arch/i386/kernel/msr.c
index bcaa6e9..c9a8f88 100644
@@ -152,6 +153,412 @@
obj-$(CONFIG_SENSORS_DS1621) += ds1621.o
obj-$(CONFIG_SENSORS_F71805F) += f71805f.o
obj-$(CONFIG_SENSORS_FSCHER) += fscher.o
+diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c
+new file mode 100644
+index 0000000..f139b41
+--- /dev/null
++++ b/drivers/hwmon/coretemp.c
+@@ -0,0 +1,400 @@
++/*
++ * coretemp.c - Linux kernel module for hardware monitoring
++ *
++ * Copyright (C) 2006 Rudolf Marek <r....@as...>
++ *
++ * Inspired from many hwmon drivers
++ *
++ * This program is free software; you can redistribute it and/or modify
++ * it under the terms of the GNU General Public License as published by
++ * the Free Software Foundation; either version 2 of the License, or
++ * (at your option) any later version.
++ *
++ * This program is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
++ * GNU General Public License for more details.
++ *
++ * You should have received a copy of the GNU General Public License
++ * along with this program; if not, write to the Free Software
++ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
++ * 02110-1301 USA.
++ */
++
++#include <linux/module.h>
++#include <linux/delay.h>
++#include <linux/init.h>
++#include <linux/slab.h>
++#include <linux/jiffies.h>
++#include <linux/hwmon.h>
++#include <linux/sysfs.h>
++#include <linux/hwmon-sysfs.h>
++#include <linux/err.h>
++#include <linux/mutex.h>
++#include <linux/list.h>
++#include <linux/platform_device.h>
++#include <asm/msr.h>
++#include <linux/cpu.h>
++
++#define DRVNAME "coretemp"
++
++typedef enum { SHOW_TEMP, SHOW_TJMAX, SHOW_LABEL, SHOW_NAME } SHOW;
++
++/*
++ * Functions declaration
++ */
++
++static struct coretemp_data *coretemp_update_device(struct device *dev);
++
++struct coretemp_data {
++ struct class_device *class_dev;
++ struct mutex update_lock;
++ const char *name;
++ u32 id;
++ char valid; /* zero until following fields are valid */
++ unsigned long last_updated; /* in jiffies */
++ int temp;
++ int tjmax;
++ /* registers values */
++ u32 therm_status;
++};
++
++static struct coretemp_data *coretemp_update_device(struct device *dev);
++
++/*
++ * Sysfs stuff
++ */
++
++
++static ssize_t show_name(struct device *dev, struct device_attribute
++ *devattr, char *buf)
++{
++ int ret;
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct coretemp_data *data = dev_get_drvdata(dev);
++
++ if (attr->index == SHOW_NAME)
++ ret = sprintf(buf, "%s\n", data->name);
++ else /* show label */
++ ret = sprintf(buf, "Core %d\n", data->id);
++ return ret;
++}
++
++static ssize_t show_alarm(struct device *dev, struct device_attribute
++ *devattr, char *buf)
++{
++ struct coretemp_data *data = coretemp_update_device(dev);
++ /* read the Out-of-spec log, never clear */
++ return sprintf(buf, "%d\n", (data->therm_status >> 5) & 1);
++}
++
++static ssize_t show_temp(struct device *dev,
++ struct device_attribute *devattr, char *buf)
++{
++ struct sensor_device_attribute *attr = to_sensor_dev_attr(devattr);
++ struct coretemp_data *data = coretemp_update_device(dev);
++ return sprintf(buf, "%d\n",
++ attr->index ==
++ SHOW_TEMP ? data->temp : data->tjmax);
++}
++
++static SENSOR_DEVICE_ATTR(temp1_input, S_IRUGO, show_temp, NULL,
++ SHOW_TEMP);
++static SENSOR_DEVICE_ATTR(temp1_crit, S_IRUGO, show_temp, NULL,
++ SHOW_TJMAX);
++static DEVICE_ATTR(temp1_crit_alarm, S_IRUGO, show_alarm, NULL);
++static SENSOR_DEVICE_ATTR(temp1_label, S_IRUGO, show_name, NULL, SHOW_LABEL);
++static SENSOR_DEVICE_ATTR(name, S_IRUGO, show_name, NULL, SHOW_NAME);
++
++static struct attribute *coretemp_attributes[] = {
++ &sensor_dev_attr_name.dev_attr.attr,
++ &sensor_dev_attr_temp1_label.dev_attr.attr,
++ &dev_attr_temp1_crit_alarm.attr,
++ &sensor_dev_attr_temp1_input.dev_attr.attr,
++ &sensor_dev_attr_temp1_crit.dev_attr.attr,
++ NULL
++};
++
++static const struct attribute_group coretemp_group = {
++ .attrs = coretemp_attributes,
++};
++
++static struct coretemp_data *coretemp_update_device(struct device *dev)
++{
++ struct coretemp_data *data = dev_get_drvdata(dev);
++
++ mutex_lock(&data->update_lock);
++
++ if (!data->valid || time_after(jiffies, data->last_updated + HZ)) {
++ u32 eax, edx;
++
++ data->valid = 0;
++ msr_read(data->id, MSR_IA32_THERM_STATUS, &eax, &edx);
++ data->therm_status = eax;
++
++ /* update only if data has been valid */
++ if (eax & 0x80000000) {
++ data->temp = data->tjmax - (((data->therm_status >> 16)
++ & 0x7f) * 1000);
++ data->valid = 1;
++ }
++ data->last_updated = jiffies;
++ }
++
++ mutex_unlock(&data->update_lock);
++ return data;
++}
++
++static int __devinit coretemp_probe(struct platform_device *pdev)
++{
++ struct coretemp_data *data;
++ struct cpuinfo_x86 *c = &(cpu_data)[pdev->id];
++ int err;
++ u32 eax, edx;
++
++ if (!(data = kzalloc(sizeof(struct coretemp_data), GFP_KERNEL))) {
++ err = -ENOMEM;
++ dev_err(&pdev->dev, "Out of memory\n");
++ goto exit;
++ }
++
++ data->id = pdev->id;
++ data->name = "coretemp";
++ mutex_init(&data->update_lock);
++ /* Tjmax default is 100C */
++ data->tjmax = 100000;
++
++ /* Some processors have Tjmax 85 following magic should detect it */
++ /* family is always 0x6 */
++
++ if (((c->x86_model == 0xf) && (c->x86_mask > 3 )) ||
++ (c->x86_model == 0xe)) {
++
++ err = msr_read(data->id, 0xee, &eax, &edx);
++ if (err) {
++ dev_warn(&pdev->dev,
++ "Unable to access MSR 0xEE, Tjmax left at %d\n",
++ data->tjmax);
++ } else if (eax & 0x40000000) {
++ data->tjmax = 85000;
++ }
++ }
++
++ /* test if we can access the THERM_STATUS MSR */
++ err = msr_read(data->id, MSR_IA32_THERM_STATUS, &eax, &edx);
++
++ if (err) {
++ dev_err(&pdev->dev,
++ "Unable to access THERM_STATUS MSR, giving up\n");
++ goto exit_free;
++ }
++ platform_set_drvdata(pdev, data);
++
++ if ((err = sysfs_create_group(&pdev->dev.kobj, &coretemp_group)))
++ goto exit_free;
++
++ data->class_dev = hwmon_device_register(&pdev->dev);
++ if (IS_ERR(data->class_dev)) {
++ err = PTR_ERR(data->class_dev);
++ dev_err(&pdev->dev, "Class registration failed (%d)\n",
++ err);
++ goto exit_class;
++ }
++
++ return 0;
++
++exit_class:
++ sysfs_remove_group(&pdev->dev.kobj, &coretemp_group);
++exit_free:
++ kfree(data);
++exit:
++ return err;
++}
++
++static int __devexit coretemp_remove(struct platform_device *pdev)
++{
++ struct coretemp_data *data = platform_get_drvdata(pdev);
++
++ hwmon_device_unregister(data->class_dev);
++ sysfs_remove_group(&pdev->dev.kobj, &coretemp_group);
++ platform_set_drvdata(pdev, NULL);
++ kfree(data);
++ return 0;
++}
++
++static struct platform_driver coretemp_driver = {
++ .driver = {
++ .owner = THIS_MODULE,
++ .name = DRVNAME,
++ },
++ .probe = coretemp_probe,
++ .remove = __devexit_p(coretemp_remove),
++};
++
++struct pdev_entry {
++ struct list_head list;
++ struct platform_device *pdev;
++ unsigned int cpu;
++};
++
++static LIST_HEAD(pdev_list);
++static DEFINE_MUTEX(pdev_list_mutex);
++
++static int __cpuinit coretemp_devices_add(unsigned int cpu)
++{
++ int err;
++ struct platform_device *pdev;
++ struct pdev_entry *pdev_entry;
++
++ pdev = platform_device_alloc(DRVNAME, cpu);
++ if (!pdev) {
++ err = -ENOMEM;
++ printk(KERN_ERR DRVNAME ": Device allocation failed\n");
++ goto exit;
++
++ }
++
++ pdev_entry = kzalloc(sizeof(struct pdev_entry), GFP_KERNEL);
++
++ if (!pdev_entry) {
++ err = -ENOMEM;
++ goto exit_device_put;
++ }
++
++ err = platform_device_add(pdev);
++
++ if (err) {
++ printk(KERN_ERR DRVNAME ": Device addition failed (%d)\n",
++ err);
++ goto exit_device_free;
++ }
++
++ pdev_entry->pdev = pdev;
++ pdev_entry->cpu = cpu;
++ mutex_lock(&pdev_list_mutex);
++ list_add_tail(&pdev_entry->list, &pdev_list);
++ mutex_unlock(&pdev_list_mutex);
++
++ return 0;
++
++exit_device_free:
++ kfree(pdev_entry);
++exit_device_put:
++ platform_device_put(pdev);
++exit:
++ return err;
++}
++
++#ifdef CONFIG_HOTPLUG_CPU
++void coretemp_devices_remove(unsigned int cpu)
++{
++ struct pdev_entry *p, *n;
++ mutex_lock(&pdev_list_mutex);
++ list_for_each_entry_safe(p, n, &pdev_list, list) {
++ if (p->cpu == cpu) {
++ platform_device_unregister(p->pdev);
++ list_del(&p->list);
++ kfree(p);
++ }
++ }
++ mutex_unlock(&pdev_list_mutex);
++}
++
++static int coretemp_cpu_callback(struct notifier_block *nfb,
++ unsigned long action, void *hcpu)
++{
++ unsigned int cpu = (unsigned long) hcpu;
++
++ switch (action) {
++ case CPU_ONLINE:
++ coretemp_devices_add(cpu);
++ break;
++ case CPU_DEAD:
++ coretemp_devices_remove(cpu);
++ break;
++ }
++ return NOTIFY_OK;
++}
++
++static struct notifier_block __cpuinitdata coretemp_cpu_notifier = {
++ .notifier_call = coretemp_cpu_callback,
++};
++#endif /* !CONFIG_HOTPLUG_CPU */
++
++static int __init coretemp_init(void)
++{
++ int i, err = -ENODEV;
++ struct pdev_entry *p, *n;
++
++ if (current_cpu_data.x86_vendor != X86_VENDOR_INTEL)
++ goto exit;
++
++ err = platform_driver_register(&coretemp_driver);
++ if (err)
++ goto exit;
++
++ for_each_online_cpu(i) {
++ struct cpuinfo_x86 *c = &(cpu_data)[i];
++
++ /* check if family 6, models e, f */
++ if ((c->cpuid_level < 0) || (c->x86 != 0x6) ||
++ !((c->x86_model == 0xe) || (c->x86_model == 0xf))) {
++
++ /* supported CPU not found, but report the unknown
++ family 6 CPU */
++ if ((c->x86 == 0x6) && (c->x86_model > 0xf))
++ printk(KERN_WARNING DRVNAME ": Unknown CPU, please"
++ " report to the lm-...@lm...\n");
++ continue;
++ }
++
++ err = coretemp_devices_add(i);
++ if (err)
++ goto exit_driver;
++ }
++ if (list_empty(&pdev_list)) {
++ err = -ENODEV;
++ goto exit_driver_unreg;
++ }
++
++#ifdef CONFIG_HOTPLUG_CPU
++ register_hotcpu_notifier(&coretemp_cpu_notifier);
++#endif
++ return 0;
++
++exit_driver:
++ mutex_lock(&pdev_list_mutex);
++ list_for_each_entry_safe(p, n, &pdev_list, list) {
++ platform_device_unregister(p->pdev);
++ list_del(&p->list);
++ kfree(p);
++ }
++ mutex_unlock(&pdev_list_mutex);
++exit_driver_unreg:
++ platform_driver_unregister(&coretemp_driver);
++exit:
++ return err;
++}
++
++static void __exit coretemp_exit(void)
++{
++ struct pdev_entry *p, *n;
++#ifdef CONFIG_HOTPLUG_CPU
++ unregister_hotcpu_notifier(&coretemp_cpu_notifier);
++#endif
++ mutex_lock(&pdev_list_mutex);
++ list_for_each_entry_safe(p, n, &pdev_list, list) {
++ platform_device_unregister(p->pdev);
++ list_del(&p->list);
++ kfree(p);
++ }
++ mutex_unlock(&pdev_list_mutex);
++ platform_driver_unregister(&coretemp_driver);
++}
++
++MODULE_AUTHOR("Rudolf Marek <r....@as...>");
++MODULE_DESCRIPTION("Intel Core temperature monitor");
++MODULE_LICENSE("GPL");
++
++module_init(coretemp_init)
++module_exit(coretemp_exit)
diff --git a/include/asm-i386/msr.h b/include/asm-i386/msr.h
index ec3b680..ff73a99 100644
--- a/include/asm-i386/msr.h
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: Nicolas B. <ni...@bo...> - 2007-03-14 05:09:11
|
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Hey, Tino Keitel wrote: > On Sat, Mar 10, 2007 at 10:31:37 -0800, nbo...@us... wrote: >> Revision: 83 >> http://svn.sourceforge.net/mactel-linux/?rev=83&view=rev >> Author: nboichat >> Date: 2007-03-10 10:31:37 -0800 (Sat, 10 Mar 2007) >> >> Log Message: >> ----------- >> Add patch series for 2.6.21-rc3 >> >> Added Paths: >> ----------- >> trunk/kernel/mactel-patches-2.6.21/ >> trunk/kernel/mactel-patches-2.6.21/applesmc.patch >> trunk/kernel/mactel-patches-2.6.21/appletouch.patch >> trunk/kernel/mactel-patches-2.6.21/apply >> trunk/kernel/mactel-patches-2.6.21/coretemp.patch >> trunk/kernel/mactel-patches-2.6.21/unapply >> trunk/kernel/mactel-patches-2.6.21/usb-storage-zerowait.patch > > Hi, > > what about the ir.patch? It was alreay missing in the patchset for > 2.6.20. Added back. Thanks for noticing it. Best regards, Nicolas -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.3 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFF94Nc01ajQnpJXgERAlvDAJ9HZG4gP1bcpxPsVxjxIk4frAJzGwCeJ3z4 3PZn9garmNyg6ZzQkd9Y89Q= =iyXx -----END PGP SIGNATURE----- |
|
From: <nbo...@us...> - 2007-03-14 05:07:52
|
Revision: 84
http://svn.sourceforge.net/mactel-linux/?rev=84&view=rev
Author: nboichat
Date: 2007-03-13 22:07:48 -0700 (Tue, 13 Mar 2007)
Log Message:
-----------
Add appleir.patch.
Added Paths:
-----------
trunk/kernel/mactel-patches-2.6.21/appleir.patch
Added: trunk/kernel/mactel-patches-2.6.21/appleir.patch
===================================================================
--- trunk/kernel/mactel-patches-2.6.21/appleir.patch (rev 0)
+++ trunk/kernel/mactel-patches-2.6.21/appleir.patch 2007-03-14 05:07:48 UTC (rev 84)
@@ -0,0 +1,435 @@
+Apple IR patch.
+
+From: ? <?>
+
+
+---
+
+ drivers/usb/input/Kconfig | 4
+ drivers/usb/input/Makefile | 1
+ drivers/usb/input/appleir.c | 390 +++++++++++++++++++++++++++++++++++++++++++
+ 3 files changed, 395 insertions(+), 0 deletions(-)
+
+diff --git a/drivers/usb/input/Kconfig b/drivers/usb/input/Kconfig
+index 69a9f3b..f88c132 100644
+--- a/drivers/usb/input/Kconfig
++++ b/drivers/usb/input/Kconfig
+@@ -185,6 +185,10 @@ config USB_ACECAD
+ To compile this driver as a module, choose M here: the
+ module will be called acecad.
+
++config USB_APPLEIR
++ tristate "Apple Mac Mini USB IR receiver (built in)"
++ depends on USB && INPUT
++
+ config USB_KBTAB
+ tristate "KB Gear JamStudio tablet support"
+ depends on USB && INPUT
+diff --git a/drivers/usb/input/Makefile b/drivers/usb/input/Makefile
+index a9d206c..31c2509 100644
+--- a/drivers/usb/input/Makefile
++++ b/drivers/usb/input/Makefile
+@@ -36,6 +36,7 @@ obj-$(CONFIG_USB_ATI_REMOTE2) += ati_remote2.o
+ obj-$(CONFIG_USB_HID) += usbhid.o
+ obj-$(CONFIG_USB_KBD) += usbkbd.o
+ obj-$(CONFIG_USB_KBTAB) += kbtab.o
++obj-$(CONFIG_USB_APPLEIR) += appleir.o
+ obj-$(CONFIG_USB_KEYSPAN_REMOTE) += keyspan_remote.o
+ obj-$(CONFIG_USB_MOUSE) += usbmouse.o
+ obj-$(CONFIG_USB_MTOUCH) += mtouchusb.o
+diff --git a/drivers/usb/input/appleir.c b/drivers/usb/input/appleir.c
+new file mode 100644
+index 0000000..dc5f604
+--- /dev/null
++++ b/drivers/usb/input/appleir.c
+@@ -0,0 +1,390 @@
++#include <linux/kernel.h>
++#include <linux/slab.h>
++#include <linux/input.h>
++#include <linux/module.h>
++#include <linux/init.h>
++#include <linux/usb.h>
++#include <linux/usb/input.h>
++#include <asm/unaligned.h>
++#include <asm/byteorder.h>
++
++/*
++ * Version Information
++ *
++ */
++
++#if 0
++#define DUMP_PACKETS
++#else
++#undef DUMP_PACKETS
++#endif
++
++#define DRIVER_VERSION "v1.1"
++#define DRIVER_AUTHOR "James McKenzie"
++#define DRIVER_DESC "USB Apple MacMini IR Receiver driver"
++#define DRIVER_LICENSE "GPL"
++
++MODULE_AUTHOR (DRIVER_AUTHOR);
++MODULE_DESCRIPTION (DRIVER_DESC);
++MODULE_LICENSE (DRIVER_LICENSE);
++
++#ifndef USB_VENDOR_ID_APPLE
++#define USB_VENDOR_ID_APPLE 0x05ac
++#endif
++#ifndef USB_DEVICE_ID_APPLE_IR
++#define USB_DEVICE_ID_APPLE_IR 0x8240
++#endif
++
++#define URB_SIZE 32
++
++#define MAX_KEYS 8
++#define MAX_KEYS_MASK (MAX_KEYS - 1 )
++
++struct appleir
++{
++ struct input_dev *dev;
++ uint8_t *data;
++ dma_addr_t dma_buf;
++ struct usb_device *usbdev;
++ struct urb *urb;
++ int timer_initted;
++ struct timer_list key_up_timer;
++ int current_key;
++ char phys[32];
++};
++
++
++static struct usb_device_id appleir_ids[] = {
++ {USB_DEVICE (USB_VENDOR_ID_APPLE, USB_DEVICE_ID_APPLE_IR),.driver_info = 0},
++ {}
++};
++
++MODULE_DEVICE_TABLE (usb, appleir_ids);
++
++
++/* I have two devices both of which report the following */
++/* 25 87 ee 83 0a + */
++/* 25 87 ee 83 0c - */
++/* 25 87 ee 83 09 << */
++/* 25 87 ee 83 06 >> */
++/* 25 87 ee 83 05 >" */
++/* 25 87 ee 83 03 menu */
++/* 26 00 00 00 00 for key repeat*/
++
++/* Thomas Glanzmann reports the following responses */
++/* 25 87 ee ca 0b + */
++/* 25 87 ee ca 0d - */
++/* 25 87 ee ca 08 << */
++/* 25 87 ee ca 07 >> */
++/* 25 87 ee ca 04 >" */
++/* 25 87 ee ca 02 menu */
++/* 26 00 00 00 00 for key repeat*/
++/* He also observes the following event sometimes */
++/* sent after a key is release, which I interpret */
++/* as a flat battery message */
++/* 25 87 e0 ca 06 flat battery */
++
++
++static int keymap[MAX_KEYS] = {
++ KEY_RESERVED, KEY_MENU,
++ KEY_PLAYPAUSE, KEY_NEXTSONG,
++ KEY_PREVIOUSSONG, KEY_VOLUMEUP,
++ KEY_VOLUMEDOWN, KEY_RESERVED
++};
++
++static void
++dump_packet (struct appleir *appleir, char *msg, uint8_t * data, int len)
++{
++ int i;
++
++ printk (KERN_ERR "appleir: %s (%d bytes)", msg, len);
++
++ for (i = 0; i < len; ++i)
++ {
++ printk (" %02x", data[i]);
++ }
++
++ printk ("\n");
++}
++
++
++static void
++key_up (struct appleir *appleir, int key)
++{
++ //printk (KERN_ERR "key %d up\n", key);
++ input_report_key (appleir->dev, key, 0);
++ input_sync (appleir->dev);
++}
++
++static void
++key_down (struct appleir *appleir, int key)
++{
++ //printk (KERN_ERR "key %d down\n", key);
++ input_report_key (appleir->dev, key, 1);
++ input_sync (appleir->dev);
++}
++
++static void
++battery_flat (struct appleir *appleir)
++{
++ printk (KERN_ERR "appleir: possible flat battery?\n");
++}
++
++static void
++key_up_tick (unsigned long data)
++{
++ struct appleir *appleir = (struct appleir *) data;
++
++ if (appleir->current_key)
++ {
++ key_up (appleir, appleir->current_key);
++ appleir->current_key = 0;
++ }
++}
++
++static void
++new_data (struct appleir *appleir, uint8_t * data, int len)
++{
++ static const uint8_t keydown[] = { 0x25, 0x87, 0xee };
++ static const uint8_t keyrepeat[] = { 0x26, 0x00, 0x00, 0x00, 0x00 };
++ static const uint8_t flatbattery[] = { 0x25, 0x87, 0xe0 };
++
++#ifdef DUMP_PACKETS
++ dump_packet (appleir, "received", data, len);
++#endif
++
++ if (len != 5)
++ return;
++
++ if (!memcmp (data, keydown, sizeof (keydown)))
++ {
++ /*If we already have a key down, take it up before marking */
++ /*this one down */
++ if (appleir->current_key)
++ key_up (appleir, appleir->current_key);
++ appleir->current_key = keymap[(data[4] >> 1) & MAX_KEYS_MASK];
++
++ key_down (appleir, appleir->current_key);
++ /*remote doesn't do key up, either pull them up, in the test */
++ /*above, or here set a timer which pulls them up after 1/8 s */
++ mod_timer (&appleir->key_up_timer, jiffies + HZ / 8);
++
++ return;
++ }
++
++ if (!memcmp (data, keyrepeat, sizeof (keyrepeat)))
++ {
++ key_down (appleir, appleir->current_key);
++ /*remote doesn't do key up, either pull them up, in the test */
++ /*above, or here set a timer which pulls them up after 1/8 s */
++ mod_timer (&appleir->key_up_timer, jiffies + HZ / 8);
++ return;
++ }
++
++ if (!memcmp (data, flatbattery, sizeof (flatbattery)))
++ {
++ battery_flat (appleir);
++ /*Fall through */
++ }
++
++ dump_packet (appleir, "unknown packet", data, len);
++}
++
++static void
++appleir_urb (struct urb *urb, struct pt_regs *regs)
++{
++ struct appleir *appleir = urb->context;
++ int retval;
++
++ switch (urb->status)
++ {
++ case 0:
++ new_data (appleir, urb->transfer_buffer, urb->actual_length);
++ break;
++ case -ECONNRESET:
++ case -ENOENT:
++ case -ESHUTDOWN:
++ /* this urb is terminated, clean up */
++ dbg ("%s - urb shutting down with status: %d", __FUNCTION__,
++ urb->status);
++ return;
++ default:
++ dbg ("%s - nonzero urb status received: %d", __FUNCTION__, urb->status);
++ }
++
++ retval = usb_submit_urb (urb, GFP_ATOMIC);
++ if (retval)
++ err ("%s - usb_submit_urb failed with result %d", __FUNCTION__, retval);
++}
++
++
++static int
++appleir_open (struct input_dev *dev)
++{
++ struct appleir *appleir = dev->private;
++
++ //appleir->urb->dev = appleir->usbdev;
++
++ if (usb_submit_urb (appleir->urb, GFP_KERNEL))
++ return -EIO;
++
++ return 0;
++}
++
++static void
++appleir_close (struct input_dev *dev)
++{
++ struct appleir *appleir = dev->private;
++ usb_kill_urb (appleir->urb);
++ del_timer_sync (&appleir->key_up_timer);
++}
++
++
++
++
++static int
++appleir_probe (struct usb_interface *intf, const struct usb_device_id *id)
++{
++ struct usb_device *dev = interface_to_usbdev (intf);
++ struct usb_endpoint_descriptor *endpoint;
++ struct appleir *appleir = NULL;
++ struct input_dev *input_dev;
++ int i;
++
++ appleir = kzalloc (sizeof (struct appleir), GFP_KERNEL);
++ if (!appleir)
++ goto fail;
++
++ memset (appleir, 0, sizeof (struct appleir));
++
++
++ appleir->data =
++ usb_buffer_alloc (dev, URB_SIZE, GFP_KERNEL, &appleir->dma_buf);
++ if (!appleir->data)
++ goto fail;
++
++ appleir->urb = usb_alloc_urb (0, GFP_KERNEL);
++ if (!appleir->urb)
++ goto fail;
++
++ appleir->usbdev = dev;
++
++ input_dev = input_allocate_device ();
++ if (!input_dev)
++ goto fail;
++
++ appleir->dev = input_dev;
++
++
++ usb_make_path (dev, appleir->phys, sizeof (appleir->phys));
++ strlcpy (appleir->phys, "/input0", sizeof (appleir->phys));
++
++ input_dev->name = "Apple Mac mini infrared remote control driver";
++ input_dev->phys = appleir->phys;
++ usb_to_input_id (dev, &input_dev->id);
++ input_dev->cdev.dev = &intf->dev;
++ input_dev->private = appleir;
++
++ input_dev->evbit[0] = BIT (EV_KEY) | BIT (EV_REP);
++ input_dev->ledbit[0] = 0;
++
++ for (i = 0; i < MAX_KEYS; i++)
++ {
++ set_bit (keymap[i], input_dev->keybit);
++ }
++
++ clear_bit (0, input_dev->keybit);
++
++ input_dev->open = appleir_open;
++ input_dev->close = appleir_close;
++
++ endpoint = &intf->cur_altsetting->endpoint[0].desc;
++
++ usb_fill_int_urb (appleir->urb, dev,
++ usb_rcvintpipe (dev, endpoint->bEndpointAddress),
++ appleir->data, 8,
++ appleir_urb, appleir, endpoint->bInterval);
++
++ appleir->urb->transfer_dma = appleir->dma_buf;
++ appleir->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
++
++ usb_set_intfdata (intf, appleir);
++
++ init_timer (&appleir->key_up_timer);
++
++ appleir->key_up_timer.function = key_up_tick;
++ appleir->key_up_timer.data = (unsigned long) appleir;
++
++ appleir->timer_initted++;
++
++ input_register_device (appleir->dev);
++
++ return 0;
++
++fail:
++
++ if (appleir)
++ {
++
++
++ if (appleir->data)
++ usb_buffer_free (dev, URB_SIZE, appleir->data, appleir->dma_buf);
++
++ if (appleir->timer_initted)
++ del_timer_sync (&appleir->key_up_timer);
++
++ if (appleir->dev)
++ input_free_device (appleir->dev);
++
++ kfree (appleir);
++ }
++
++ return -ENOMEM;
++}
++
++static void
++appleir_disconnect (struct usb_interface *intf)
++{
++ struct appleir *appleir = usb_get_intfdata (intf);
++
++ usb_set_intfdata (intf, NULL);
++ if (appleir)
++ {
++ input_unregister_device (appleir->dev);
++ if (appleir->timer_initted)
++ del_timer_sync (&appleir->key_up_timer);
++ usb_kill_urb (appleir->urb);
++ usb_free_urb (appleir->urb);
++ usb_buffer_free (interface_to_usbdev (intf), URB_SIZE, appleir->data,
++ appleir->dma_buf);
++ kfree (appleir);
++ }
++}
++
++static struct usb_driver appleir_driver = {
++ .name = "appleir",
++ .probe = appleir_probe,
++ .disconnect = appleir_disconnect,
++ .id_table = appleir_ids,
++};
++
++static int __init
++appleir_init (void)
++{
++ int retval;
++ retval = usb_register (&appleir_driver);
++ if (retval)
++ goto out;
++ info (DRIVER_VERSION ":" DRIVER_DESC);
++out:
++ return retval;
++}
++
++static void __exit
++appleir_exit (void)
++{
++ usb_deregister (&appleir_driver);
++}
++
++module_init (appleir_init);
++module_exit (appleir_exit);
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|
|
From: Erik O. <er...@pl...> - 2007-03-14 04:24:52
|
Hello, I have modified Nicolas Boichat's excellent backlight script; while the substance of it remains the same, I have added help options, percentage-based lighting increases, and some other things. Since I'm now using it on my computer, I thought I'd share it with you folks in case you're interested. Attached is mblight.c. I'm compiling it with: gcc -I/usr/src/linux/include mblight.c -o mblight -lpci -- Erik |
|
From: Tino K. <tin...@ti...> - 2007-03-12 21:22:23
|
On Sat, Mar 10, 2007 at 10:31:37 -0800, nbo...@us... wrote: > Revision: 83 > http://svn.sourceforge.net/mactel-linux/?rev=83&view=rev > Author: nboichat > Date: 2007-03-10 10:31:37 -0800 (Sat, 10 Mar 2007) > > Log Message: > ----------- > Add patch series for 2.6.21-rc3 > > Added Paths: > ----------- > trunk/kernel/mactel-patches-2.6.21/ > trunk/kernel/mactel-patches-2.6.21/applesmc.patch > trunk/kernel/mactel-patches-2.6.21/appletouch.patch > trunk/kernel/mactel-patches-2.6.21/apply > trunk/kernel/mactel-patches-2.6.21/coretemp.patch > trunk/kernel/mactel-patches-2.6.21/unapply > trunk/kernel/mactel-patches-2.6.21/usb-storage-zerowait.patch Hi, what about the ir.patch? It was alreay missing in the patchset for 2.6.20. Regards, Tino |
|
From: Thomas M. <tho...@we...> - 2007-03-11 18:47:42
|
Suspend to disk doesn't work on my macbook pro. The suspend seems to hang while enabling the non-boot cpus again. with platform = "test" and state = "disk" i get this: " [cut] acpi device:02: freeze video video:00: freeze acpi device:01: freeze acpi PNP0C02:00: freeze pci_root PNP0A08:00: freeze button PNP0C0E:00: freeze button PNP0C0C:00: freeze acpi APP0002:00: freeze button PNP0C0D:00: freeze ac ACPI0003:00: freeze acpi device:00: freeze processor ACPI0007:01: freeze processor ACPI0007:00: freeze button button_power:00: freeze acpi acpi_system:00: freeze Disabling non-boot CPUs ... CPU 1 is now offline SMP alternatives: switching to UP code PM: Removing info for No Bus:cpu1 PM: Removing info for No Bus:msr1 CPU1 is down swsusp debug: Waiting for 5 seconds. Enabling non-boot CPUs ... ----> Here the process hangs. But a fortunate coincidence showed me that an acpi event continues the process (pressing the power off button a few times... (2x - 4x) ). SMP alternatives: switching to SMP code Booting processor 1/1 eip 3000 CPU 1 irqstacks, hard=c0389000 soft=c0387000 Initializing CPU#1 Calibrating delay using timer specific routine.. 3663.73 BogoMIPS (lpj=6103576) CPU: After generic identify, caps: bfe9fbff 00100000 00000000 00000000 0000c1a9 00000000 00000000 monitor/mwait feature present. CPU: L1 I cache: 32K, L1 D cache: 32K CPU: L2 cache: 2048K CPU: Physical Processor ID: 0 CPU: Processor Core ID: 1 CPU: After all inits, caps: bfe9fbff 00100000 00000000 00002940 0000c1a9 00000000 00000000 Intel machine check architecture supported. Intel machine check reporting enabled on CPU#1. CPU1: Intel Genuine Intel(R) CPU T2400 @ 1.83GHz stepping 08 PM: Adding info for No Bus:cpu1 PM: Adding info for No Bus:msr1 CPU1 is up acpi acpi_system:00: resuming button button_power:00: resuming processor ACPI0007:00: resuming processor ACPI0007:01: resuming acpi device:00: resuming ac ACPI0003:00: resuming button PNP0C0D:00: resuming acpi APP0002:00: resuming button PNP0C0C:00: resuming button PNP0C0E:00: resuming pci_root PNP0A08:00: resuming " Any ideas? The same is true for disk = "platform". With kind regards thomas |