Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 278939
b: refs/heads/master
c: 373c78e
h: refs/heads/master
i:
  278937: f439f44
  278935: b678cf1
v: v3
  • Loading branch information
Arend van Spriel authored and John W. Linville committed Dec 13, 2011
1 parent fb694b9 commit e6f51e8
Show file tree
Hide file tree
Showing 3 changed files with 29 additions and 43 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: d3126c52eb7f3239b45481facc4078b08ed1027c
refs/heads/master: 373c78e19d6c00ff87fc251584d8bab65150e751
68 changes: 26 additions & 42 deletions trunk/drivers/net/wireless/brcm80211/brcmsmac/otp.c
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ struct otp_fn_s {
};

struct otpinfo {
uint ccrev; /* chipc revision */
struct bcma_device *core; /* chipc core */
const struct otp_fn_s *fn; /* OTP functions */
struct si_pub *sih; /* Saved sb handle */

Expand Down Expand Up @@ -133,9 +133,10 @@ struct otpinfo {
#define OTP_SZ_FU_144 (144/8) /* 144 bits */

static u16
ipxotp_otpr(struct otpinfo *oi, struct chipcregs __iomem *cc, uint wn)
ipxotp_otpr(struct otpinfo *oi, uint wn)
{
return R_REG(&cc->sromotp[wn]);
return bcma_read16(oi->core,
CHIPCREGOFFS(sromotp[wn]));
}

/*
Expand All @@ -161,19 +162,21 @@ static int ipxotp_max_rgnsz(struct si_pub *sih, int osizew)
return ret;
}

static void _ipxotp_init(struct otpinfo *oi, struct chipcregs __iomem *cc)
static void _ipxotp_init(struct otpinfo *oi)
{
uint k;
u32 otpp, st;
int ccrev = ai_get_ccrev(oi->sih);


/*
* record word offset of General Use Region
* for various chipcommon revs
*/
if (oi->ccrev == 21 || oi->ccrev == 24
|| oi->ccrev == 27) {
if (ccrev == 21 || ccrev == 24
|| ccrev == 27) {
oi->otpgu_base = REVA4_OTPGU_BASE;
} else if (oi->ccrev == 36) {
} else if (ccrev == 36) {
/*
* OTP size greater than equal to 2KB (128 words),
* otpgu_base is similar to rev23
Expand All @@ -182,32 +185,29 @@ static void _ipxotp_init(struct otpinfo *oi, struct chipcregs __iomem *cc)
oi->otpgu_base = REVB8_OTPGU_BASE;
else
oi->otpgu_base = REV36_OTPGU_BASE;
} else if (oi->ccrev == 23 || oi->ccrev >= 25) {
} else if (ccrev == 23 || ccrev >= 25) {
oi->otpgu_base = REVB8_OTPGU_BASE;
}

/* First issue an init command so the status is up to date */
otpp =
OTPP_START_BUSY | ((OTPPOC_INIT << OTPP_OC_SHIFT) & OTPP_OC_MASK);

W_REG(&cc->otpprog, otpp);
for (k = 0;
((st = R_REG(&cc->otpprog)) & OTPP_START_BUSY)
&& (k < OTPP_TRIES); k++)
;
bcma_write32(oi->core, CHIPCREGOFFS(otpprog), otpp);
st = bcma_read32(oi->core, CHIPCREGOFFS(otpprog));
for (k = 0; (st & OTPP_START_BUSY) && (k < OTPP_TRIES); k++)
st = bcma_read32(oi->core, CHIPCREGOFFS(otpprog));
if (k >= OTPP_TRIES)
return;

/* Read OTP lock bits and subregion programmed indication bits */
oi->status = R_REG(&cc->otpstatus);
oi->status = bcma_read32(oi->core, CHIPCREGOFFS(otpstatus));

if ((ai_get_chip_id(oi->sih) == BCM43224_CHIP_ID)
|| (ai_get_chip_id(oi->sih) == BCM43225_CHIP_ID)) {
u32 p_bits;
p_bits =
(ipxotp_otpr(oi, cc, oi->otpgu_base + OTPGU_P_OFF) &
OTPGU_P_MSK)
>> OTPGU_P_SHIFT;
p_bits = (ipxotp_otpr(oi, oi->otpgu_base + OTPGU_P_OFF) &
OTPGU_P_MSK) >> OTPGU_P_SHIFT;
oi->status |= (p_bits << OTPS_GUP_SHIFT);
}

Expand All @@ -220,7 +220,7 @@ static void _ipxotp_init(struct otpinfo *oi, struct chipcregs __iomem *cc)
oi->hwlim = oi->wsize;
if (oi->status & OTPS_GUP_HW) {
oi->hwlim =
ipxotp_otpr(oi, cc, oi->otpgu_base + OTPGU_HSB_OFF) / 16;
ipxotp_otpr(oi, oi->otpgu_base + OTPGU_HSB_OFF) / 16;
oi->swbase = oi->hwlim;
} else
oi->swbase = oi->hwbase;
Expand All @@ -230,7 +230,7 @@ static void _ipxotp_init(struct otpinfo *oi, struct chipcregs __iomem *cc)

if (oi->status & OTPS_GUP_SW) {
oi->swlim =
ipxotp_otpr(oi, cc, oi->otpgu_base + OTPGU_SFB_OFF) / 16;
ipxotp_otpr(oi, oi->otpgu_base + OTPGU_SFB_OFF) / 16;
oi->fbase = oi->swlim;
} else
oi->fbase = oi->swbase;
Expand All @@ -240,11 +240,8 @@ static void _ipxotp_init(struct otpinfo *oi, struct chipcregs __iomem *cc)

static int ipxotp_init(struct si_pub *sih, struct otpinfo *oi)
{
uint idx;
struct chipcregs __iomem *cc;

/* Make sure we're running IPX OTP */
if (!OTPTYPE_IPX(oi->ccrev))
if (!OTPTYPE_IPX(ai_get_ccrev(sih)))
return -EBADE;

/* Make sure OTP is not disabled */
Expand Down Expand Up @@ -282,21 +279,13 @@ static int ipxotp_init(struct si_pub *sih, struct otpinfo *oi)
}

/* Retrieve OTP region info */
idx = ai_coreidx(sih);
cc = ai_setcoreidx(sih, SI_CC_IDX);

_ipxotp_init(oi, cc);

ai_setcoreidx(sih, idx);

_ipxotp_init(oi);
return 0;
}

static int
ipxotp_read_region(struct otpinfo *oi, int region, u16 *data, uint *wlen)
{
uint idx;
struct chipcregs __iomem *cc;
uint base, i, sz;

/* Validate region selection */
Expand Down Expand Up @@ -365,14 +354,10 @@ ipxotp_read_region(struct otpinfo *oi, int region, u16 *data, uint *wlen)
return -EINVAL;
}

idx = ai_coreidx(oi->sih);
cc = ai_setcoreidx(oi->sih, SI_CC_IDX);

/* Read the data */
for (i = 0; i < sz; i++)
data[i] = ipxotp_otpr(oi, cc, base + i);
data[i] = ipxotp_otpr(oi, base + i);

ai_setcoreidx(oi->sih, idx);
*wlen = sz;
return 0;
}
Expand All @@ -384,22 +369,21 @@ static const struct otp_fn_s ipxotp_fn = {

static int otp_init(struct si_pub *sih, struct otpinfo *oi)
{

int ret;

memset(oi, 0, sizeof(struct otpinfo));

oi->ccrev = ai_get_ccrev(sih);
oi->core = ai_findcore(sih, BCMA_CORE_CHIPCOMMON, 0);

if (OTPTYPE_IPX(oi->ccrev))
if (OTPTYPE_IPX(ai_get_ccrev(sih)))
oi->fn = &ipxotp_fn;

if (oi->fn == NULL)
return -EBADE;

oi->sih = sih;

ret = (oi->fn->init) (sih, oi);
ret = (oi->fn->init)(sih, oi);

return ret;
}
Expand Down
2 changes: 2 additions & 0 deletions trunk/drivers/net/wireless/brcm80211/include/chipcommon.h
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@

#include "defs.h" /* for PAD macro */

#define CHIPCREGOFFS(field) offsetof(struct chipcregs, field)

struct chipcregs {
u32 chipid; /* 0x0 */
u32 capabilities;
Expand Down

0 comments on commit e6f51e8

Please sign in to comment.