Changeset 14350


Ignore:
Timestamp:
2009-02-01T21:20:49+01:00 (7 years ago)
Author:
mb
Message:

bcm47xx: Implement the remaining PMU resource inits.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/target/linux/brcm47xx/patches-2.6.28/810-ssb-add-pmu-support.patch

    r14347 r14350  
    1414=================================================================== 
    1515--- /dev/null   1970-01-01 00:00:00.000000000 +0000 
    16 +++ linux-2.6.28.2/drivers/ssb/driver_chipcommon_pmu.c  2009-02-01 19:51:46.000000000 +0100 
    17 @@ -0,0 +1,259 @@ 
     16+++ linux-2.6.28.2/drivers/ssb/driver_chipcommon_pmu.c  2009-02-01 21:16:15.000000000 +0100 
     17@@ -0,0 +1,378 @@ 
    1818+/* 
    1919+ * Sonics Silicon Backplane 
     
    9090+{ 
    9191+       struct ssb_bus *bus = cc->dev->bus; 
    92 +       const struct pmu0_plltab_entry *e; 
     92+       const struct pmu0_plltab_entry *e = NULL; 
    9393+       u32 pmuctl, tmp, pllctl; 
    9494+       unsigned int i; 
     
    9898+               crystalfreq = 25000; 
    9999+       } 
    100 +       e = pmu0_plltab_find_entry(crystalfreq); 
     100+       if (crystalfreq) 
     101+               e = pmu0_plltab_find_entry(crystalfreq); 
    101102+       if (!e) 
    102103+               e = pmu0_plltab_find_entry(SSB_PMU0_DEFAULT_XTALFREQ); 
     
    112113+       } 
    113114+ 
    114 +       ssb_printk(KERN_INFO PFX "Programming PLL to %u.%u MHz\n", 
     115+       ssb_printk(KERN_INFO PFX "Programming PLL to %u.%03u MHz\n", 
    115116+                  (crystalfreq / 1000), (crystalfreq % 1000)); 
    116117+ 
     
    209210+} 
    210211+ 
     212+struct pmu_res_updown_tab_entry { 
     213+       u8 resource;    /* The resource number */ 
     214+       u16 updown;     /* The updown value */ 
     215+}; 
     216+ 
     217+enum pmu_res_depend_tab_task { 
     218+       PMU_RES_DEP_SET = 1, 
     219+       PMU_RES_DEP_ADD, 
     220+       PMU_RES_DEP_REMOVE, 
     221+}; 
     222+ 
     223+struct pmu_res_depend_tab_entry { 
     224+       u8 resource;    /* The resource number */ 
     225+       u8 task;        /* SET | ADD | REMOVE */ 
     226+       u32 depend;     /* The depend mask */ 
     227+}; 
     228+ 
     229+static const struct pmu_res_updown_tab_entry pmu_res_updown_tab_4328a0[] = { 
     230+       { .resource = SSB_PLLRES_4328_EXT_SWITCHER_PWM,         .updown = 0x0101, }, 
     231+       { .resource = SSB_PLLRES_4328_BB_SWITCHER_PWM,          .updown = 0x1F01, }, 
     232+       { .resource = SSB_PLLRES_4328_BB_SWITCHER_BURST,        .updown = 0x010F, }, 
     233+       { .resource = SSB_PLLRES_4328_BB_EXT_SWITCHER_BURST,    .updown = 0x0101, }, 
     234+       { .resource = SSB_PLLRES_4328_ILP_REQUEST,              .updown = 0x0202, }, 
     235+       { .resource = SSB_PLLRES_4328_RADIO_SWITCHER_PWM,       .updown = 0x0F01, }, 
     236+       { .resource = SSB_PLLRES_4328_RADIO_SWITCHER_BURST,     .updown = 0x0F01, }, 
     237+       { .resource = SSB_PLLRES_4328_ROM_SWITCH,               .updown = 0x0101, }, 
     238+       { .resource = SSB_PLLRES_4328_PA_REF_LDO,               .updown = 0x0F01, }, 
     239+       { .resource = SSB_PLLRES_4328_RADIO_LDO,                .updown = 0x0F01, }, 
     240+       { .resource = SSB_PLLRES_4328_AFE_LDO,                  .updown = 0x0F01, }, 
     241+       { .resource = SSB_PLLRES_4328_PLL_LDO,                  .updown = 0x0F01, }, 
     242+       { .resource = SSB_PLLRES_4328_BG_FILTBYP,               .updown = 0x0101, }, 
     243+       { .resource = SSB_PLLRES_4328_TX_FILTBYP,               .updown = 0x0101, }, 
     244+       { .resource = SSB_PLLRES_4328_RX_FILTBYP,               .updown = 0x0101, }, 
     245+       { .resource = SSB_PLLRES_4328_XTAL_PU,                  .updown = 0x0101, }, 
     246+       { .resource = SSB_PLLRES_4328_XTAL_EN,                  .updown = 0xA001, }, 
     247+       { .resource = SSB_PLLRES_4328_BB_PLL_FILTBYP,           .updown = 0x0101, }, 
     248+       { .resource = SSB_PLLRES_4328_RF_PLL_FILTBYP,           .updown = 0x0101, }, 
     249+       { .resource = SSB_PLLRES_4328_BB_PLL_PU,                .updown = 0x0701, }, 
     250+}; 
     251+ 
     252+static const struct pmu_res_depend_tab_entry pmu_res_depend_tab_4328a0[] = { 
     253+       { 
     254+               /* Adjust ILP Request to avoid forcing EXT/BB into burst mode. */ 
     255+               .resource = SSB_PLLRES_4328_ILP_REQUEST, 
     256+               .task = PMU_RES_DEP_SET, 
     257+               .depend = ((1 << SSB_PLLRES_4328_EXT_SWITCHER_PWM) | 
     258+                          (1 << SSB_PLLRES_4328_BB_SWITCHER_PWM)), 
     259+       }, 
     260+}; 
     261+ 
     262+static const struct pmu_res_updown_tab_entry pmu_res_updown_tab_4325a0[] = { 
     263+       { .resource = SSB_PLLRES_4325_XTAL_PU,                  .updown = 0x1501, }, 
     264+}; 
     265+ 
     266+static const struct pmu_res_depend_tab_entry pmu_res_depend_tab_4325a0[] = { 
     267+       { 
     268+               /* Adjust HT-Available dependencies. */ 
     269+               .resource = SSB_PLLRES_4325_HT_AVAIL, 
     270+               .task = PMU_RES_DEP_ADD, 
     271+               .depend = ((1 << SSB_PLLRES_4325_RX_PWRSW_PU) | 
     272+                          (1 << SSB_PLLRES_4325_TX_PWRSW_PU) | 
     273+                          (1 << SSB_PLLRES_4325_LOGEN_PWRSW_PU) | 
     274+                          (1 << SSB_PLLRES_4325_AFE_PWRSW_PU)), 
     275+       }, 
     276+}; 
     277+ 
    211278+static void ssb_pmu_resources_init(struct ssb_chipcommon *cc) 
    212279+{ 
    213280+       struct ssb_bus *bus = cc->dev->bus; 
    214281+       u32 min_msk = 0, max_msk = 0; 
     282+       unsigned int i; 
     283+       const struct pmu_res_updown_tab_entry *updown_tab = NULL; 
     284+       unsigned int updown_tab_size; 
     285+       const struct pmu_res_depend_tab_entry *depend_tab = NULL; 
     286+       unsigned int depend_tab_size; 
    215287+ 
    216288+       switch (bus->chip_id) { 
     
    219291+                * min_msk = 0xCBB 
    220292+                * max_msk = 0x7FFFF 
    221 +                * updown table size = 0 
    222 +                * depend table size = 0 
    223293+                */ 
    224294+               break; 
    225295+       case 0x4325: 
    226 +               //TODO 
     296+               /* Power OTP down later. */ 
     297+               min_msk = (1 << SSB_PLLRES_4325_CBUCK_BURST) | 
     298+                         (1 << SSB_PLLRES_4325_LNLDO2_PU); 
     299+               if (chipco_read32(cc, SSB_CHIPCO_CHIPSTAT) & 
     300+                   SSB_CHIPCO_CHST_4325_PMUTOP_2B) 
     301+                       min_msk |= (1 << SSB_PLLRES_4325_CLDO_CBUCK_BURST); 
     302+               /* The PLL may turn on, if it decides so. */ 
     303+               max_msk = 0xFFFFF; 
     304+               updown_tab = pmu_res_updown_tab_4325a0; 
     305+               updown_tab_size = ARRAY_SIZE(pmu_res_updown_tab_4325a0); 
     306+               depend_tab = pmu_res_depend_tab_4325a0; 
     307+               depend_tab_size = ARRAY_SIZE(pmu_res_depend_tab_4325a0); 
    227308+               break; 
    228309+       case 0x4328: 
    229 +               //TODO 
     310+               min_msk = (1 << SSB_PLLRES_4328_EXT_SWITCHER_PWM) | 
     311+                         (1 << SSB_PLLRES_4328_BB_SWITCHER_PWM) | 
     312+                         (1 << SSB_PLLRES_4328_XTAL_EN); 
     313+               /* The PLL may turn on, if it decides so. */ 
     314+               max_msk = 0xFFFFF; 
     315+               updown_tab = pmu_res_updown_tab_4328a0; 
     316+               updown_tab_size = ARRAY_SIZE(pmu_res_updown_tab_4328a0); 
     317+               depend_tab = pmu_res_depend_tab_4328a0; 
     318+               depend_tab_size = ARRAY_SIZE(pmu_res_depend_tab_4328a0); 
    230319+               break; 
    231320+       case 0x5354: 
     
    238327+                          bus->chip_id); 
    239328+       } 
    240 +       //TODO table upload 
     329+ 
     330+       if (updown_tab) { 
     331+               for (i = 0; i < updown_tab_size; i++) { 
     332+                       chipco_write32(cc, SSB_CHIPCO_PMU_RES_TABSEL, 
     333+                                      updown_tab[i].resource); 
     334+                       chipco_write32(cc, SSB_CHIPCO_PMU_RES_UPDNTM, 
     335+                                      updown_tab[i].updown); 
     336+               } 
     337+       } 
     338+       if (depend_tab) { 
     339+               for (i = 0; i < depend_tab_size; i++) { 
     340+                       chipco_write32(cc, SSB_CHIPCO_PMU_RES_TABSEL, 
     341+                                      depend_tab[i].resource); 
     342+                       switch (depend_tab[i].task) { 
     343+                       case PMU_RES_DEP_SET: 
     344+                               chipco_write32(cc, SSB_CHIPCO_PMU_RES_DEPMSK, 
     345+                                              depend_tab[i].depend); 
     346+                               break; 
     347+                       case PMU_RES_DEP_ADD: 
     348+                               chipco_set32(cc, SSB_CHIPCO_PMU_RES_DEPMSK, 
     349+                                            depend_tab[i].depend); 
     350+                               break; 
     351+                       case PMU_RES_DEP_REMOVE: 
     352+                               chipco_mask32(cc, SSB_CHIPCO_PMU_RES_DEPMSK, 
     353+                                             ~(depend_tab[i].depend)); 
     354+                               break; 
     355+                       default: 
     356+                               SSB_WARN_ON(1); 
     357+                       } 
     358+               } 
     359+       } 
    241360+ 
    242361+       /* Set the resource masks. */ 
     
    310429=================================================================== 
    311430--- linux-2.6.28.2.orig/include/linux/ssb/ssb_driver_chipcommon.h       2009-02-01 13:22:59.000000000 +0100 
    312 +++ linux-2.6.28.2/include/linux/ssb/ssb_driver_chipcommon.h    2009-02-01 19:17:25.000000000 +0100 
     431+++ linux-2.6.28.2/include/linux/ssb/ssb_driver_chipcommon.h    2009-02-01 21:09:37.000000000 +0100 
    313432@@ -181,6 +181,16 @@ 
    314433 #define SSB_CHIPCO_PROG_WAITCNT                0x0124 
     
    328447 #define SSB_CHIPCO_UART0_IMR           0x0304 
    329448 #define SSB_CHIPCO_UART0_FCR           0x0308 
    330 @@ -197,6 +207,156 @@ 
     449@@ -197,6 +207,172 @@ 
    331450 #define SSB_CHIPCO_UART1_LSR           0x0414 
    332451 #define SSB_CHIPCO_UART1_MSR           0x0418 
     
    482601+#define SSB_PLLRES_5354_RF_PLL_FILTBYP         18 
    483602+#define SSB_PLLRES_5354_BB_PLL_PU              19 
    484   
    485   
    486   
    487 @@ -353,11 +513,20 @@ 
     603+ 
     604+ 
     605+ 
     606+/** Chip specific Chip-Status register contents. */ 
     607+#define SSB_CHIPCO_CHST_4325_SPROM_OTP_SEL     0x00000003 
     608+#define SSB_CHIPCO_CHST_4325_DEFCIS_SEL                0 /* OTP is powered up, use def. CIS, no SPROM */ 
     609+#define SSB_CHIPCO_CHST_4325_SPROM_SEL         1 /* OTP is powered up, SPROM is present */ 
     610+#define SSB_CHIPCO_CHST_4325_OTP_SEL           2 /* OTP is powered up, no SPROM */ 
     611+#define SSB_CHIPCO_CHST_4325_OTP_PWRDN         3 /* OTP is powered down, SPROM is present */ 
     612+#define SSB_CHIPCO_CHST_4325_SDIO_USB_MODE     0x00000004 
     613+#define SSB_CHIPCO_CHST_4325_SDIO_USB_MODE_SHIFT  2 
     614+#define SSB_CHIPCO_CHST_4325_RCAL_VALID                0x00000008 
     615+#define SSB_CHIPCO_CHST_4325_RCAL_VALID_SHIFT  3 
     616+#define SSB_CHIPCO_CHST_4325_RCAL_VALUE                0x000001F0 
     617+#define SSB_CHIPCO_CHST_4325_RCAL_VALUE_SHIFT  4 
     618+#define SSB_CHIPCO_CHST_4325_PMUTOP_2B                 0x00000200 /* 1 for 2b, 0 for to 2a */ 
     619  
     620  
     621  
     622@@ -353,11 +529,20 @@ 
    488623 struct ssb_device; 
    489624 struct ssb_serial_port; 
     
    506641  
    507642 static inline bool ssb_chipco_available(struct ssb_chipcommon *cc) 
    508 @@ -365,6 +534,17 @@ static inline bool ssb_chipco_available( 
     643@@ -365,6 +550,17 @@ static inline bool ssb_chipco_available( 
    509644        return (cc->dev != NULL); 
    510645 } 
     
    524659  
    525660 extern void ssb_chipco_suspend(struct ssb_chipcommon *cc); 
    526 @@ -406,4 +586,8 @@ extern int ssb_chipco_serial_init(struct 
     661@@ -406,4 +602,8 @@ extern int ssb_chipco_serial_init(struct 
    527662                                  struct ssb_serial_port *ports); 
    528663 #endif /* CONFIG_SSB_SERIAL */ 
Note: See TracChangeset for help on using the changeset viewer.